我在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 test中遇到以下错误:
java.lang.ClassFormatError:方法中的Absent Code属性 在类文件javax / persistence / Persistence
中不是native或abstract
我找到了有关此错误here的一些信息。 所以,我删除了'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>
现在一切正常,除了生成的war包含hibernate jar,我不想要。
有任何建议如何解决这个问题,正确的maven pom?
答案 0 :(得分:0)
如果您正在使用应用程序服务器,则可以将hibernate依赖项替换为(仍为特定于供应商的)JPA API,并提供此类提供的范围(示例适用于具有hibernate的JBoss):
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<scope>provided</scope>
</dependency>
答案 1 :(得分: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 是必需的,否则,包目标触发'test'会导致我开始时出现同样的错误,因为它使用为'package'配置的相同依赖集。
java.lang.ClassFormatError:方法中的Absent Code属性 在类文件javax / persistence / Persistence
中不是native或abstract
答案 2 :(得分:0)
我遇到了同样的问题,并且能够通过向Maven pom.xml文件添加几个依赖项来解决它。 See this answer了解更多详情。