9

テスト範囲の Maven 依存関係を Eclipse に反映させるのに問題があります - ビルド パスに表示され、Eclipse のコンパイル / Javadoc の解決をいじっています。

Java EE ライブラリの例

ライブラリを使用してjavaee-api-6.0、Java EE アプリケーションをコンパイルしています。

ただし、単体テストの目的で、API 以外にもアクセスしたかったので、実装が必要でした。だから私は次のようなテストスコープで埋め込まれたグラスフィッシュライブラリを含めました:

<repositories>
    <repository>
        <id>glassfish-extras-repository</id>
        <url>http://download.java.net/maven/glassfish/org/glassfish/extras</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>compile</scope>
        <type>jar</type>
    </dependency>
</dependencies>

Maven で期待どおりに動作する

私の理解では、glassfish の依存関係のため、通常のフェーズ<scope>test</scope>には含まれません。compile

両方の依存関係がtest-compileフェーズに含まれるため、テスト クラスをコンパイルするときに、前者が後者よりも優先して使用されるように、javaee-api 依存関係の前に Glassfish 依存関係を必ず配置しました。そのため、Maven のみを使用してビルドする場合、この構成は問題になりません。

Eclipse 内で期待どおりに動作しない

ただし、m2e と Eclipse を使用すると、glassfish の依存関係がビルド パスにリストされます。

ビルド パスにリストされている依存関係

グラスフィッシュの依存関係は java-ee-api の依存関係の前にリストされているため、Eclipse が間違ったライブラリ (java-ee-api ではなくグラスフィッシュ) を使用して javadocs を検証/コンパイル/検索しているように見えます。(実際、コンパイルで間違ったライブラリが使用されているかどうかは 100% 確信が持てません。コードの検証時に使用されるコンパイルを内部で Eclipse が Maven を使用して実行しているかどうかによって異なりますが、そうであるかどうかはわかりませんが、 javadoc ルックアップは間違いなく間違ったライブラリを参照しています)

質問

単体テストを実行する場合を除いて、Eclipse が Glassfish lib を使用しないようにするにはどうすればよいですか? そのAPIの特定の実装ではなく、APIでコンパイル/ Javadocルックアップが発生していることを確認したい。

4

4 に答える 4

10

この質問を最初に投稿してからしばらく経ちましたが、

単体テストを実行する場合を除いて、Eclipse が Glassfish lib を使用しないようにするにはどうすればよいですか?

できません。Eclipse は、プロジェクトごとに 1 つのビルド パスという概念に関連付けられており、m2e/m2e-wtp は、次のバグで説明されているように、この制限を克服できません (または克服しません)。

依存関係のスコープは Eclipse のコンパイルには影響しません

更新 2016 年 6 月 8 日

JEE7 のリリースにより、javaee-apijar ファイルには実際に使用可能なクラス ファイルが含まれるようになりました。これは、テストで使用できることを意味glassfish-embedded-allし、pom ファイルの前に jar ファイルを指定する必要はありません。

これで、Eclipse はソースと Javadoc を適切な jar ファイルから (つまりjavaee-api、そうではなくglassfish-embedded-all)プルするようglassfish-embedded-allになりました。

これは、私が最初に提案した質問に対する解決策ではありませんが当時私が経験していた根本的な問題に対する解決策です。おそらく、それは他の誰かにも役立つでしょう。

于 2013-03-20T07:54:05.487 に答える
7

私もこの問題に苦労しており、最終的に解決策を見つけました。m2e プラグインをインストールしましたが、デフォルトではインストールされていない m2e wtp コネクタも必要です。m2e のバージョンによって、これは異なる方法で行われます。最新バージョンの場合は、「設定」->「Maven」->「ディスカバリー」の下にあります。「カタログを開く」をクリックします。M2E - WTP コネクタを選択します。

インストール後、プロジェクトを右クリックし、'Maven' -> 'Update Project Configuration...' を選択します。

pom.xml は次のようになります。

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

Eclipse は問題なくデプロイされ、単体テストは Eclipse で実行され、コマンドラインでの Maven も同様に快適に動作するはずです。

お役に立てれば。

于 2012-04-16T19:22:41.173 に答える
2

たぶん、surefire-pluginを次のように設定すれば機能します

  • APIの依存関係(プロジェクトの依存関係として含まれている)を除外し、
  • glasfishの依存関係を含める(プロジェクトの依存関係には含めないでください)

このような:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <classpathDependencyExcludes>
                    <classpathDependencyExclude>javax:javaee-api
                    </classpathDependencyExclude>
                </classpathDependencyExcludes>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.glassfish.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.1</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

surefireプラグイン(テストを実行するプラグイン)サイトのクラスパスの構成部分をご覧ください。


ドキュメントから(外側の除外要素名内側の除外要素名と「s」)

     <classpathDependencyExcludes>
        <classpathDependencyExcludes>org.apache.commons:commons-email</classpathDependencyExcludes>
      </classpathDependencyExcludes>

しかし、私はそれが(' s 'を持つ外部要素名のみ)であるべきだと思います:

     <classpathDependencyExcludes>
        <classpathDependencyExclude>org.apache.commons:commons-email</classpathDependencyExclude>
      </classpathDependencyExcludes>
于 2012-02-24T22:48:24.207 に答える
0

ビルドパスに lib がない場合、eclipse 側から考えると、特にユニットテストやリソース処理などのためにそれを使用することはできません。

実践から - pom.xml で依存関係を整理してみてください。ほとんどの場合、Eclipse ビルドパスのライブラリの順序は同じになります。

于 2012-02-24T09:52:47.903 に答える