Usando o Maven, como implementar corretamente o WAR dependendo do JAR J2EE / JPA?

Estou criando um projeto modular do Maven. O projeto é implantado no Glassfish 3.1. Projeto (webapp) consiste em três módulos:

  • “Comum”, consistindo na funcionalidade principal (persistência, lógica de autenticação, etc.), incorporada em um JAR
  • “Usuário”, dependendo do Common, embutido em um WAR
  • “Admin”, também dependendo de Common e WARred

Ambos os WAR usam classs com annotations pesadas (@Entity, @Inject, @EJB, …) do Common. Atualmente Common é um JAR, mas não é um requisito. A questão é: como implantar corretamente esse projeto?

Pelo meu conhecimento atual (influenciado pelo google e stackoverflow):

EDITAR

Como o comentário de Mike Decks sugere que a configuração está correta, suponho que fornecer uma mensagem de erro completa seria útil:

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]. 

O que isso significaria? O que poderia ser a causa?

EDIT2

Estou incluindo classs relevantes (aparadas um pouco, isto é, não methods get / set, importações, etc.)

 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() {} } 

e:

 @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 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; } } 

O problema foi resolvido incluindo META-INF/beans.xml e META-INF/faces-config.xml vazios . Arquivos vazios implicam configuração padrão, entre outras coisas, deixando Glassfish saber que deve procurar classs necessárias para @Inject, enquanto a falta deles não.

Da mensagem de erro, parece que isso é um problema com o CDI. Não é possível encontrar uma implementação adequada para o tipo ‘Autenticação’ quando ele tenta inicializar seu LoginFilter. Verifique se a class de implementação do tipo ‘Autenticação’ está disponível em seu arquivo JAR.

Como o @Mike mencionou, você deve colocar suas dependencies na sua pasta lib como arquivos JAR, portanto isso não deve ser um problema. Eu acho que isso não é um problema com o Maven.

Use um EAR para empacotar os EJB-jars e WARs.