2013-02-14 38 views
10

我有一個Java EE項目。該項目使用Maven構建到.ear存檔中。有一個包含JPA 2持久性單元的庫jar,它位於耳朵的庫目錄中(所以其他多個模塊可以使用它)。在java EE中,應該將哪些jar放在庫dir中?

雖然在此持久性單元中添加Shiro的Permission接口的實現作爲實體,但我無法正確部署,因爲持久單元中不可用的shiro類。我最終發現我需要將庫jar目錄中的所有依賴關係(也適用於傳遞層次)放到庫目錄中以便部署它。

所以最終佈局看起來大致是這樣的:現在

ear 
`- lib 
    `- persistence-unit.jar 
    - shiro-core.jar 
    - slf4j-api.jar 
- module1 
- moduleN 
- library1.jar 
- libraryN.jar 

,對於問題:

  1. 是否有什麼應該被放入庫目錄中的任何引導線,並且是我的解決方案一般可接
  2. 爲什麼耳朵根中的庫不可用於lib目錄中的罐子?
  3. 爲什麼maven不能自動計算出來?

編輯:pom.xml的耳內

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>ear</artifactId> 
    <packaging>ear</packaging> 

    <parent> 
     <groupId>com.example</groupId> 
     <artifactId>project</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-ear-plugin</artifactId> 
       <version>2.7</version> 
       <configuration> 
        <modules> 
         <webModule> 
          <!-- ... --> 
         </webModule> 
         <ejbModule> 
          <!-- ... --> 
         </ejbModule> 
         <jarModule> 
          <groupId>com.example</groupId> 
          <artifactId>persistence-unit</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 

         <-- I added these to get the deployment working --> 
         <jarModule> 
          <groupId>org.apache.shiro</groupId> 
          <artifactId>shiro-core</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 
         <jarModule> 
          <groupId>org.slf4j</groupId> 
          <artifactId>slf4j-api</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 
        </modules> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>com.example</groupId> 
      <artifactId>persistence-unit</artifactId> 
     </dependency> 
     <dependency> 
      <!-- ... --> 
      <type>war</type> 
     </dependency> 
     <dependency> 
      <!-- ... --> 
      <type>ejb</type> 
     </dependency> 

     <dependency> 
      <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-core</artifactId> 
     </dependency> 
    </dependencies> 
</project> 

而且持久化單元:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>persistence-unit</artifactId> 
    <packaging>jar</packaging> 

    <parent> 
     <groupId>com.example</groupId> 
     <artifactId>project</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.jboss.spec</groupId> 
      <artifactId>jboss-javaee-6.0</artifactId> 
      <type>pom</type> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-core</artifactId> 
     </dependency> 
    </dependencies> 
</project> 

回答

7

是否有什麼應該被放入庫目錄中的任何引導線,而且我的解決方案通常可以接受?

你已經非常努力了,應該可用於所有EAR模塊的JAR應該在這裏。

爲什麼耳朵根中的庫不可用於lib目錄中的罐子?

它通常以相反的方式工作,lib文件夾中的JAR可用於根目錄中的JAR。不過,我相信你可以使用<includeInApplicationXml>實現這一點:

<jarModule> 
    <groupId>org.nisse</groupId> 
    <artifactId>hue</artifactId> 
    <includeInApplicationXml>true</includeInApplicationXml> 
</jarModule> 

爲什麼不自動行家想出解決辦法?

我認爲你的意思是說,maven不會自動將所有的傳遞依賴放置在lib?我相信它應該做,並且確實 - 你能展示你的POM的相關部分嗎?

編輯:您的EAR模塊應該只引用EJB JAR和WAR作爲依賴關係。任何傳遞依賴應該包括在自動EAR,在默認情況下頂層 - 這可以在耳插件<configuration><defaultLibBundleDir>標誌覆蓋:

<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-ear-plugin</artifactId> 
<version>2.7</version> 
<configuration> 
    <defaultLibBundleDir>lib</defaultLibBundleDir> 
    <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
     </manifest> 
    </archive> 
    <modules> 
     ... etc. 

另外,<archive>/<addClasspath>部分應確保清單類路徑設置正確。也許這正是你錯過的東西?

乾杯,

+0

你對問題3的假設是正確的。我用poms更新了這個問題。簡化,但希望是足夠的,並沒有刪除實際問題:) – 2013-02-14 11:51:59

+0

我已經添加了更多信息給我的答案,我希望能夠幫助你進一步 - 至少addClasspath'可能是你需要的。我懷疑你的問題是否讓maven實際上包含瞬態代價或只是讓它們在類路徑中可用。如果是後者,我認爲這正是你需要的。乾杯, – 2013-02-14 12:57:15

5

我不會的Maven的配置發表評論,而只是在那裏圖書館應該去。

有是共享庫的EAR的模塊,其中包括兩種主要機制 - 捆綁庫(在EE.8.2.1在the Java EE 6 specification描述)和安裝的庫(EE.8.2.2)。

已安裝的庫與EAR分開安裝,因此在應用程序服務器上的許多EAR之間共享。

捆綁庫可以安裝在lib(默認庫目錄)中,由一個EAR的部署描述符的library-directory元素中指定的目錄和/或在任何目錄與模塊的Class-Path清單頭(被引用或由模塊引用的一個jar,該模塊又定義了一個傳遞庫)。

我在Java EE 6規範的理解是Class-Path可以在任何地方EAR引用任何庫,但隨後的罐子的內容變成了非Java EE模塊。這意味着在部署時不會考慮persistence.xml,並且文件中定義的潛在持久性上下文在運行時不會生效。

在你的情況下,persistence-unit.jar似乎包含持久性單元配置,並使它們可用於其他模塊,它應該被放置在lib目錄中。另外兩個罐子 - shiro-core.jarslf4j-api.jar - 可以位於EAR的任何地方(包括用於簡單部署的lib目錄 - 不需要在任何引用庫/模塊中具有Class-Path元素)。

將其包裝起來以便於部署,使您的庫位於lib目錄中,除非使用了Class-Path並指向另一個目錄。在這種情況下,您應該檢查引用jar文件是否不是具有持久性單元定義的Java EE jar文件,因爲它將無法正確部署(並且PU將不可用於模塊)。

3

This article有很大的表解釋的事情:

表2的標準存檔可以加載在其內部或從任何其他檔案它是依賴於任一包裝類。

Module  Code Sources 
EAR 
      All JARs in the /lib directory of the EAR 
      Manifest Class-Path of any JARs in 1 
EJB-JAR 
      EJB-JAR file itself 
      JARs referenced by manifest Class-Path of EJB-JAR 
      JARs referenced by manifest Class-Path of above JARs (in 2) 
WAR 
      WEB-INF/classes 
      JARs in WEB-INF/lib 
      JARs referenced by manifest Class-Path of WAR 
      JARs referenced by manifest Class-Path of JARs in 2 and 3 
相關問題