1

pom に次の依存関係を持つ Web アプリがあります。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.9.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.1.9.Final</version>
    <scope>test</scope>
</dependency>

この構成では、junit テストで次のエラーが発生します。

java.lang.ClassFormatError: クラス ファイル javax/persistence/Persistence のネイティブまたは抽象ではないメソッドにコード属性がありません

このエラーに関する情報はこちらで見つかりまし。そこで、「javaee-web-api」の依存関係を削除しました。

その後、「package javax.persistence does not exist」などのコンパイル エラーが発生します。

そこで、「hibernate-entitymanager」のスコープをデフォルト (コンパイル) に変更しました。

作業ポン (依存関係) は次のようになります。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.9.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.1.9.Final</version>
</dependency>

生成された戦争に休止状態のjarが含まれていることを除いて、これですべて問題ありません。

これを修正する方法はありますか? maven pomを修正しますか?

4

3 に答える 3

0

私は同じ問題を抱えていましたが、Maven pom.xml ファイルにいくつかの依存関係を追加することで解決できました。 詳細については、この回答を参照してください。

于 2016-12-27T19:42:56.987 に答える
0

最後に、プロファイルを使用して、同じ依存関係のセットでこれを機能させました。pom の関連セクションは次のとおりです。

<profiles>
    <profile>
        <id>test</id>
        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>4.1.9.Final</version>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>package</id>
        <dependencies>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-web-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>4.1.9.Final</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.9.1.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

ここで、次のコマンドを使用してパッケージ化とテストを行います。

mvn -Ptest テスト

mvn -Ppackage パッケージ -DskipTests

-DskipTestsが必要です。そうしないと、パッケージの目標が「テスト」をトリガーし、「パッケージ」用に構成された同じ依存関係のセットを使用するため、私が開始したのと同じエラーが発生します。

java.lang.ClassFormatError: クラス ファイル javax/persistence/Persistence のネイティブまたは抽象ではないメソッドにコード属性がありません

于 2013-02-10T07:22:09.103 に答える
0

アプリケーションサーバーで作業している場合は、休止状態の依存関係を、次のような提供されたスコープを持つ (まだベンダー固有の) JPA API に置き換えることができます (例は、休止状態の JBoss の場合です)。

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <scope>provided</scope>
</dependency>
于 2013-02-09T05:58:34.283 に答える