2011-05-27 30 views
2

我正在創建一個模塊化的Maven項目。項目部署在Glassfish 3.1上。項目(web應用)包括三個模塊:使用Maven,如何根據J2EE/JPA JAR正確部署WAR?

  • 「普通」,由核心功能(持久性,認證邏輯等),內置於JAR
  • 「用戶」,這取決於普通,內置於一個WAR
  • 「管理」,還取決於通用和通用爭戰

兩個WAR使用重型註釋(@實體,@注入,@EJB,...)班。目前常見的是JAR,但這不是必需的。問題是:如何正確部署這樣的項目?

通過我目前(谷歌和計算器的影響)的知識:

  • 常見不可能是一個JAR,因爲.jar文件放入WEB-INF \ lib目錄中的JAR。這使得部署時初始化成爲可能,因爲Glassfish期望.class併產生「Unsatisfied dependencies」錯誤,導致部署失敗。

  • 通用不能一戰,因爲生成後WAR覆蓋複製ocurrs - 導致依賴於自身建設......

編輯

麥克甲板意見建議設置是好的,我認爲提供一個完整的錯誤信息將是有用的:

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

常見的可以並且應該是JAR。我不確定你的部署失敗的原因,但是WEB-INF/lib絕對是爲了容納WAR的JAR文件依賴關係。這聽起來像你有正確的基本設置,你真正需要做的是解決部署錯誤。 – 2011-05-27 22:22:36

回答

3

問題已通過添加META-INF/beans.xmlMETA-INF/faces-config.xml解決。空文件意味着默認配置,讓GlassFish知道它應該尋找@Inject所需的類,而缺少它們則不會。

0

使用EAR來打包EJB-jar和WARs。

+0

Java EE 6的進步之一是'簡化打包',它允許開發人員將EJB直接集成到WAR文件中作爲類(WEB-INF/classes)或庫(WEB-INF/lib)。創建一個耳朵來解決這個問題可能是一個解決方法,但它應該是最後一件事情......因爲它可能無法解決這種情況。 – vkraemer 2011-05-28 14:35:07

1

從錯誤消息看來,這是CDI的問題。當它試圖初始化你的LoginFilter時,它無法找到'Authentication'類型的正確實現。檢查你的JAR文件中是否有'Authentication'類型的實現類。

像@Mike所說的,你應該把你的依賴關係放到你的lib文件夾中作爲JAR文件,所以這不應該是一個問題。我想這對Maven來說不是問題。

+0

類型'認證'存在於JAR內部。也許這是@Injected的事實與錯誤有關?可能是什麼原因和/或如何解決這個問題? – triazotan 2011-05-28 12:13:46

+0

什麼是'認證'(例如一個EJB)?這是容器注射的東西嗎? – 2011-05-28 13:54:58

+0

認證是注入LoginFilter類(@Inject)的@SessionScoped(javax.enterprise.context.SessionScoped)託管bean。 – triazotan 2011-05-28 15:42:24