1

我在 pom 中有一个具有以下依赖项的网络应用程序:

<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”依赖项。

之后我得到编译错误'包 javax.persistence 不存在',等等。

因此,我将“hibernate-entitymanager”的范围更改为默认(编译)。

工作 pom(依赖项)如下所示:

<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

如果您正在使用应用程序服务器,则可以使用(仍然是特定于供应商的)JPA API 替换休眠依赖项,该 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 回答
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 package -DskipTests

-DskipTests是必需的,否则,包目标会触发“测试”,导致与我开始时相同的错误,因为它使用为“包”配置的相同依赖项集。

java.lang.ClassFormatError:类文件 javax/persistence/Persistence 中非本机或抽象方法中的缺失代码属性

于 2013-02-10T07:22:09.103 回答
0

我遇到了同样的问题,并且能够通过向 Maven pom.xml 文件添加几个依赖项来解决它。 有关更多详细信息,请参阅此答案

于 2016-12-27T19:42:56.987 回答