2013-02-14 10 views
10

私はJava EEプロジェクトを持っています。このプロジェクトは、Mavenを.earアーカイブに使用してビルドされています。耳のライブラリディレクトリにあるJPA 2パーシスタンスユニットを含むライブラリのjarファイルがあります(他の複数のモジュールでも使用できます)。Java EEでは、どのjarファイルをライブラリディレクトリに置くべきですか?

ShiroのPermissionインタフェースの実装をこのパーシスタンスユニットのエンティティとして追加すると、永続ユニットで使用できないshiroクラスが存在するため、耳を正しく配置することができませんでした。私は最終的に、ライブラリー・ディレクトリー内のライブラリー・ジャーナルのすべての依存関係(ライブラリー・ディレクトリーにも適用されています)を配備する必要があることを理解しました。

だから、最終的なレイアウトは、このように大まかに見える:

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

、質問のために:

  1. は、ライブラリディレクトリに置くべきである何のための任意のガイド線が存在し、そして私ですソリューションは一般的に受け入れられる?
  2. 耳の根元のライブラリがlibディレクトリのjarファイルで利用できないのはなぜですか?
  3. なぜこれを自動的に把握していないのですか?

EDIT:耳用の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ディレクトリのjarファイルで利用できないのはなぜですか?

これは通常、他の方法で動作します。libフォルダのJARは、ルートのものに使用できます。しかし、私はあなたが<includeInApplicationXml>を使用することによって、これを達成できると信じて:

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

なぜこれを自動的に把握Mavenのではないでしょうか?

あなたはmavenがすべての推移的な依存関係を自動的に置き換えないことを意味しますか?lib?私はそれがすべきだと信じています - おそらくPOMの関連部分を見せてもらえますか?

編集: EARモジュールは、EJB JARおよびWARを依存関係としてのみ参照する必要があります。また

<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>セクションはそのマニフェストを確保すべきである:これは、耳プラグイン<configuration><defaultLibBundleDir>タグで上書きすることができます - 任意の推移的依存性デフォルトでトップレベルに、自動的にEARに含まれるべきですクラスパスが正しく設定されています。おそらく、これはまさにあなたが欠けているものでしょうか?

乾杯、

+0

質問3についてのあなたの仮定が正しいです。私はポムで質問を更新しました。単純化されていますが、実際には問題がなくても十分です。 –

+0

私は自分の答えにもっと多くの情報を加えました。少しでも助けてくれることを願っています - 少なくとも 'addClasspath'が必要なものかもしれません。あなたの問題が実際に一時的なdepsを含めるようになっているのか、クラスパスで利用できるようにするのかは疑問です。後者の場合、これはあなたが必要とするものだと私は思う。乾杯、 –

5

私はMavenのの設定についてはコメントしませんが、単にどこライブラリが行く必要があります。 バンドルライブラリ(the Java EE 6 specificationにEE.8.2.1で説明)インストールされたライブラリ(EE.8.2.2) -

は、EARのモジュール間でライブラリを共有するための2つの主要なメカニズムがありませ。

インストールされたライブラリは、EARとは別にインストールされるため、アプリケーションサーバー上の多くのEARで共有されます。

lib(デフォルトのライブラリディレクトリ)にインストールされてもよいバンドルライブラリ、EARのデプロイメントディスクリプタのlibrary-directory要素によって指定されたディレクトリ及び/又は任意のディレクトリにモジュールのClass-Pathマニフェストヘッダ(で参照されますまたは推移的ライブラリーを定義するモジュールによって参照されるjar)を使用します。

Java EE 6仕様を理解すると、Class-PathはEAR内の任意のライブラリを参照できますが、jarのコンテンツは非Java EEモジュールになります。これは、展開時にpersistence.xmlが考慮されず、ファイルに定義されている潜在的な永続コンテキストが実行時に有効にならないことを意味します。

あなたのケースでは、persistence-unit.jarは永続ユニット構成を含んでいるように見え、他のモジュールで使用できるようにするにはlibディレクトリに配置する必要があります。他の2つのjar - shiro-core.jarslf4j-api.jar - は、EARのどこにでも置くことができます(単純なデプロイメントのためにlibディレクトリを含みます - 参照するライブラリ/モジュールのいずれにもClass-Path要素を持つ必要はありません)。

Class-Pathが使用され、別のディレクトリを指していない限り、ライブラリをlibディレクトリに配置して簡単に展開できます。この場合、参照元の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 
関連する問題