无法正确配置maven依赖项

时间:2013-02-09 05:53:34

标签: maven maven-2 maven-3

我在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?

3 个答案:

答案 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了解更多详情。