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

时间:2011-05-27 22:05:45

标签: java maven glassfish war

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

  • “Common”,由内置于JAR的核心功能(持久性,身份验证逻辑等)组成
  • “用户”,取决于Common,内置于WAR
  • “Admin”,也取决于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<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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

使用EAR打包EJB-jar和WAR。