【问题标题】:How can I use different JARs for compiling and testing in maven?如何在 Maven 中使用不同的 JAR 进行编译和测试?
【发布时间】:2011-01-08 03:25:30
【问题描述】:

我针对 javaee-api 编译我的程序。但是对于 Junit 测试,我必须使用像 glassfish 的 javaee.jar 这样的特定实现来避免 java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/persistence/Persistence(另见1)。

因此避免使用仅在 glassfish 实现中可用的方法,我想使用通用 api 编译我的工件,但使用实现 jar 运行 junit。但是两者都提供了相同命名的类和接口,所以类加载器遇到了麻烦。

解决此问题的最佳方法是什么?我可以用maven解决这个问题吗?

非常感谢

【问题讨论】:

    标签: unit-testing maven-2 classloader jar dependency-management


    【解决方案1】:

    我认为这是可能的。实际上,从 2.0.9 版本开始,Maven 使用 POM 顺序构建类路径,因此您现在可以对其进行操作。如果你把它和Dependency Scope结合起来,应该可以实现你想要的。实际上,如果您将 GlassFish 的 javaee 依赖项(具有 test 范围)放在 javaee-api 依赖项之前,则在测试中前者应放在后者之前类路径,因此被单元测试使用,而后者将在编译期间使用。从理论上讲,这应该可行,但它有点脆弱,因此需要仔细记录。

    类似的东西(带有一个虚构的 GFv3 jar):

    <dependencies>
      <dependency><!-- this one will be first on the test classpath -->
        <groupId>org.glassfish</groupId>
        <artifactId>javaee</artifactId>
        <version>6.0</version>
        <scope>test</scope>
      <dependency>
      <dependency><!-- this one will be used during compile -->
        <groupId>javax.javaee-api</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
      <dependency>
      ...
    </dependencies>
    

    【讨论】:

    • 我正在使用 mvn 2.2.1,但您的建议不起作用。我试过 javaeejavaee-api5-glassfish-v2.1-b60etestjavaeejavaee-api5provided 5-glassfish-v2。 1-b60e 是 glassfish 2.1 b60e 提供的我的本地版本
    • 这是我的错... groupid 和/或 artifactId 必须不同!
    • Maven 接缝使用在一个 poim.xml 中配置的 groupId:artifactId 的最后一个配置。因此,如果您首先使用版本“5”配置“provided”范围,然后使用相同的 groupId:artifactId scrope“test”配置版本“5-my-glassfish”,maven 只使用第二个版本创建一个有效的 pom。
    • @marabol 感谢您的反馈。这是一个非常“特殊”的用例,但这听起来像是一个 Maven 错误。
    猜你喜欢
    • 2011-06-13
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2010-11-15
    • 1970-01-01
    • 2016-05-30
    • 2018-03-03
    相关资源
    最近更新 更多