Unit testing 如何在maven中使用不同的JAR进行编译和测试?

Unit testing 如何在maven中使用不同的JAR进行编译和测试?,unit-testing,maven-2,classloader,jar,dependency-management,Unit Testing,Maven 2,Classloader,Jar,Dependency Management,我根据JavaEEAPI编译我的程序。但对于Junit测试,我必须使用一个特定的实现,比如glassfish的javaee.jar,以避免出现java.lang.ClassFormatError这样的错误:在类文件javax/persistence/persistence中,方法中缺少非本机或抽象的代码属性(另请参见) 所以,避免使用仅在glassfish实现中可用的方法,我希望使用通用api编译我的工件,但使用实现jar运行junit。但两者都提供了相同的命名类和推断面,因此类装入器遇到了麻烦

我根据JavaEEAPI编译我的程序。但对于Junit测试,我必须使用一个特定的实现,比如glassfish的javaee.jar,以避免出现java.lang.ClassFormatError这样的错误:在类文件javax/persistence/persistence中,方法中缺少非本机或抽象的代码属性(另请参见)

所以,避免使用仅在glassfish实现中可用的方法,我希望使用通用api编译我的工件,但使用实现jar运行junit。但两者都提供了相同的命名类和推断面,因此类装入器遇到了麻烦

解决这个问题的最好办法是什么?我能用maven解决这个问题吗


非常感谢

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

类似的东西(使用虚构的GFv3 jar):


玻璃鱼
java企业版
6
测试
javax.javaee-api
JavaEEAPI
6
假如
...

我正在使用mvn 2.2.1,但您的建议无效。我试过javaee javaee api 5-glassfish-v2.1-b60e测试javaee javaee api 5提供的5-glassfish-v2.1-b60e是glassfish 2.1 b60eIt提供的本地版本是我的错。。。groupid和/或artifactId必须不同!Maven使用在一个poim.xml中配置的groupId:artifactId的最后一个配置。因此,如果您在版本“5”的第一个作用域中配置“提供”,然后在版本“5-my-glassfish”的第一个作用域中配置相同的groupId:artifactId scrope“test”,那么maven将只使用第二个作用域创建有效的pom。@marabol感谢您的反馈。这是一个非常“特殊”的用例,但听起来像是一个Maven bug。
<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>