2011-06-22 11 views
7

私は最近glassfish standalone(v3.1)vs glassfish embedded(v3.1)vs java SEと、java.endorsed.dirsの使用方法に関する問題に遭遇しました。私が持っていた特定の問題はhereですが、私はそれが似たようなものに遭遇するのは最後だとは思いません。Java EEとjava.endorsed.dirsを扱うためのベストプラクティスはありますか?

私が見つけた情報herehereは、コンパイル時にglassfish承認ライブラリをブートストラップクラスパスに追加することを提案しています。しかし、thisバグレポートには、グラスフィッシュ埋め込みを使用する際に承認されたライブラリを正しく設定することは難しいことが示唆されています。

私はスタンドアロンのグラスフィッシュコンテナに展開すると、私のアプリケーションはグラスフィッシュが含まれる承認されたライブラリに対して実行されるようですが、埋め込まれたコンテナを使用するとそうではありません。私は元の問題に遭遇しました。なぜなら、maven-embedded-glassfish-pluginは、glassfish standaloneのような裏書きライブラリを使って埋め込まれたglassfishを開始しないからです。私はまた、他の容器(例:jboss)にglassfishと同じ一連の裏書付きライブラリが含まれているかどうかもわかりません。

私のアプリケーションが保証されたライブラリに対してコンパイルされ、常に保証されたライブラリを使用してブートストラップされたコンテナにデプロイされていることを確認するために苦労していると思いますか(2) Java SE 6にバンドルされているものを使うまで

私が(2)を選択した場合、より新しい保証付きライブラリでブートストラップされたコンテナにアプリケーションをデプロイする際に、非互換性について心配する必要がありますか?

誰もが提供できる洞察を私は感謝します。

答えて

2

GlassFish EmbbededはJava EE仕様と互換性のあるライブラリと一緒に出荷されていませんか?デフォルトでロードされているライブラリはありませんか? (そうでない場合は、ここにバグを記入してください:http://java.net/jira/browse/EMBEDDED_GLASSFISH)。

私は、Java EE仕様APIに対してコンパイルして、コンテナに独自の実装を使用させてください。

最初の部分では、Mavenを使用する場合、私はCodehaus archetypesが保証されたライブラリを設定するのが好きです。これは、両方のクリーンおよびApplication Server不可知論です:

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

...

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.2</version> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     <compilerArguments> 
      <endorseddirs>${endorsed.dir}</endorseddirs> 
     </compilerArguments> 
    </configuration> 
</plugin> 

...かなり多くある

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
      <phase>validate</phase> 
      <goals> 
       <goal>copy</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${endorsed.dir}</outputDirectory> 
       <silent>true</silent> 
       <artifactItems> 
        <artifactItem> 
         <groupId>javax</groupId> 
         <artifactId>javaee-endorsed-api</artifactId> 
         <version>6.0</version> 
         <type>jar</type> 
        </artifactItem> 
       </artifactItems> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

は、Java EEに対するあなたのプロジェクトをコンパイルする必要があるすべての6 API。 Java EE 6準拠のApp Serverはこれらのサービスを提供する必要があり、アプリケーションでどのように使用できるようにするか心配する必要はありません。

Java EEサービスのブートストラップの責任は、App Serverの責任である必要があります。独自の「社内」ソリューションを試してみると、JAR地獄が緩んでしまう可能性があります。

乾杯、

+0

あなたが言ったことは(IMO)それは動作するはずですが、Java SEの古いライブラリがロードされているときに「最初の試合」のシナリオを勝ち取っています。誰でもJVMを起動するにはjava.endorsed.dirsを設定する必要がありますが、組み込みコンテナの中にはいくつか難しいものがあります。 Glassfish Embeddedの場合、すべてが1つの大きなJARにあり、保証されたライブラリが特定の場所にあることが保証されているとは思われません。私は[Arquillian thread](http://community.jboss.org/thread/168521?tstart=0)を立ち上げ、彼らの考えを見ました。私は[Glassfishのバグ](http://java.net/jira/browse/EMBEDDED_GLASSFISH-131)を追加しました。 –

+0

@ Ryan J.私はあなたのバグレポートを見て、それは確かに再現性があります。これは私の以前の投稿の精神に従い、GlassFishチームによって修正されるべきですが、これを修正できるまで、いくつかの簡単な回避策があります: 1.メインクラスを使用してサーバーを起動します。 2.他の埋め込みコンテナに切り替えます。 3. MAVEN_OPTSを使用して承認されたライブラリを設定します(ugglyですが、すぐに行かれます)。 –

4

EDIT:上記javaee-endorsed-apiのアプローチは、おそらく正常に動作しますが、それは私にウィリーズを与えます。私はそれがもはや生産され、維持されているとは思わない。さらに、pom.xmlには、javaee-compact-apiという名前のポイントが含まれていることが反映されており、実装クラスを削除する方法がわかります。対照的に、あなたが推奨するAPI jarをチェリーピックすることは、より安定した柔軟性があるように思われます。最後に、まだjavaee-endorsed-apiのアプローチを使用する場合は、引き続き推奨する一般的なアプローチを使用して、代わりにjavaee-endorsed-api.jarを指定してください。 Ryan;

Ryan;私は、あなたが長い旅路を同じ道のりで(StackOverflow、java.netフォーラムなどに触れて)同じ道を歩いているだけです。

ユニットテストまたはインテグレーションテストでは、わかっているようにjava.endorsed.dirsシステムプロパティを設定する必要があります。

これは、テストを実行しているJVMがこれを実行するような方法で行う必要があります。それはあなたが確実に走っているかどうかによって決まります。

Surefireがに設定されていない場合は、フォークではありません。これはおそらく悪いことです。ここで設定を再評価する必要があります。

あなたはフォークに確実なセットを持っている場合は、あなたは、単にこのように、systemPropertyVariablesスタンザでjava.endorsed.dirsを含めることができると思うかもしれません:

<systemPropertyVariables> 
    <java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs> 
</systemPropertyVariables> 

...しかし、それは間違っているだろう。その理由は、実際に実行されているプログラムがForkedBooterと呼ばれており、ForkedBooterがプログラムで単位テストのシステムプロパティを設定しているためです。つまり、<systemPropertyVariables>スタンザがForkedBooterによって読み取られるまでには、それはすでに遅すぎます。

しかし、あなたはこのようなあなたの確実な設定で<argLine>を使用することができます。

<configuration> 
    <argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine> 
</configuration> 

シュアフォークは、その承認のディレクトリが適切に設定されているだろうことをVM

。さて、どのような価値を提供するかについて話しましょう。

オーバーライドするAPIを選択してチェリーしたいとします。あなたの場合、javax.annotation.*は正当な選択です。関連するjarが格納されているローカルMavenリポジトリのディレクトリを指定したいとします。

${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion} 
  • Mavenの保証${settings.localRepository}がローカルのMavenリポジトリが住んでいる場所の値に拡大すること:ここでは

    は、私が使用した値です。

  • ${file.separator}は、Mavenプロパティの代わりにSystem.getProperty("file.separator")の値を取得する方法です。
  • 私の場合、私はすでに<dependency>the GlassFish artifact that bundles up the javax.annotation package as defined in Java EE 6に宣言しています。ここで私はアーティファクトへの道を作りました。また、javaxAnnotationVersionという名前のプロパティを定義しました。これは私のために3.1.2に設定されています。

あなたはこのすべてを行うたら、その後、シュアフォークVMは、あなたのユニットテストを実行する際に、承認ディレクトリは今javax.annotationクラスを収容するjarファイルを含む、ローカルのMavenリポジトリ内のディレクトリに設定することになりますプロセス中で実行中の埋め込みGlassFish — —は、Java SE 6バージョンの代わりにjavax.annotationのJava EE 6バージョンを使用します。これがあなたを助けることを願っています。

関連する問題