Используя Maven, как правильно развернуть WAR в зависимости от JAR J2EE / JPA? - PullRequest
2 голосов
/ 28 мая 2011

Я создаю модульный проект Maven. Проект развернут на Glassfish 3.1. Проект (webapp) состоит из трех модулей:

  • «Общий», состоящий из основных функций (персистентность, логика аутентификации и т. Д.), Встроенный в JAR
  • «Пользователь», в зависимости от общего, встроен в WAR
  • «Администратор», также в зависимости от Common и WARred

В обеих WAR используются аннотированные классы (@Entity, @Inject, @EJB, ...) из Common. В настоящее время Common - это JAR, но это не требование. Вопрос: Как правильно развернуть такой проект?

Насколько я знаю (под влиянием Google и stackoverflow):

  • Common не может быть JAR, потому что файл .jar помещается в каталог WEB-INF \ lib внутри JAR. Это делает инициализацию во время развертывания, поскольку Glassfish ожидает .classes и выдает ошибку «Неудовлетворенные зависимости», что приводит к неудачному развертыванию.

  • Общим не может быть WAR, потому что при копировании с наложением WAR происходит после сборки - в результате сборка зависит от самой себя ...

EDIT

Поскольку комментарий Майка Декса говорит о том, что настройка в порядке, я полагаю, что было бы полезно предоставить полное сообщение об ошибке:

Deployment Error for module: User: Error occurred during deployment: 
Exception while loading the app : WELD-001408 Unsatisfied dependencies 
for type [Authentication] with qualifiers [@Default] at injection point
[[field] @Inject xxx.xxx.servlets.LoginFilter.authentication].

Что бы это значило? В чем может быть причина?

EDIT2

Я включаю соответствующие классы (немного обрезан, т.е. не получаю / не устанавливаю методы, импортирую и т. Д.)

public class LoginFilter implements Filter {

    @Inject
    Authentication authentication;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        LoginBean login = (LoginBean) httpRequest.getSession().getAttribute("loginBean");
        if((login == null || !login.isAuthenticated())) {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            String requestUrl = httpRequest.getRequestURI().toString();
            authentication.setNavigateAfterLogin(requestUrl);
            httpResponse.sendRedirect("./../login.html");
        }       
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig fConfig) throws ServletException {}

    @Override
    public void destroy() {}
}

и

@SessionScoped  
public class Authentication implements Serializable {   
    @Inject
    private UserDatabaseController userDb;
    private ShopUser user;
    private String navigateAfterLogin;
    private String login;
    private String password;

    public boolean doLogin(String username, String password) {
        List<ShopUser> users = userDb.getUsers();
        for(ShopUser shopUser : users) {
            if(shopUser.getLogin().equals(username) && shopUser.getPassword().equals(password)) {
                setUser(shopUser);
                return true;
            }
        }
        return false;
    }

    public void doLogout() {
        setUser(null);
    }   

    public boolean isAuthenticated() {
        return getUser() != null;
    }
}

Ответы [ 3 ]

3 голосов
/ 30 мая 2011

Проблема была решена путем добавления пусто META-INF/beans.xml и META-INF/faces-config.xml.Пустые файлы подразумевают конфигурацию по умолчанию, в частности, сообщая Glassfish, что он должен искать классы, необходимые для @Inject, в то время как их отсутствие - нет.

1 голос
/ 28 мая 2011

Из сообщения об ошибке кажется, что это проблема с CDI. Он не может найти правильную реализацию для типа «Аутентификация», когда он пытается инициализировать ваш LoginFilter. Проверьте, доступен ли класс реализации типа «Аутентификация» в вашем файле JAR.

Как уже упоминал @Mike, вы должны поместить свои зависимости в вашу папку lib в виде JAR-файлов, так что это не должно быть проблемой. Я думаю, это не проблема с Maven.

0 голосов
/ 28 мая 2011

Используйте EAR для упаковки EJB-jar-файлов и WAR-ов.

...