使用Maven,如何根据J2EE / JPA JAR正确部署WAR?

我正在创建一个模块化的Maven项目。 项目部署在Glassfish 3.1上。 项目(webapp)包含三个模块:

  • “通用”,由内置于JAR的核心function(持久性,身份validation逻辑等)组成
  • “用户”,取决于Common,内置于WAR中
  • “管理员”,也取决于Common和WARred

两个WAR都使用Common中的重注释(@ Entity,@ Inject,@ EJB,…)类。 目前Common是一个JAR,但它不是必需的。 问题是: 如何正确部署此类项目?

通过我目前(谷歌和stackoverflow影响)的知识:

  • Common不能是JAR,因为.jar文件放在JAR里面的WEB-INF \ lib目录下。 这使得部署时初始化,因为Glassfish期望.classes并产生“不满意的依赖性”错误,导致部署失败。

  • Common不能是WAR,因为在构建后使用WAR覆盖复制ocurrs – 导致构建依赖于它自己…

编辑

正如Mike Decks评论建议设置正常,我认为提供完整的错误消息会很有用:

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

我附上相关的类(修剪了一下,即没有get / set方法,导入等)

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

通过添加 META-INF/beans.xmlMETA-INF/faces-config.xml 。 空文件意味着默认配置,除其他外,让Glassfish知道它应该寻找@Inject所需的类,而缺少它们不会。

从错误消息看,这似乎是CDI的问题。 在尝试初始化LoginFilter时,无法为“身份validation”类型找到正确的实现。 检查JAR文件中是否有“Authentication”类型的实现类。

就像@Mike提到的那样,你应该把你的依赖项作为JAR文件放到你的lib文件夹中,所以这应该不是问题。 我想这不是Maven的问题。

使用EAR打包EJB-jar和WAR。