NoClassDefFoundError:注释处理期间的org / junit / AfterClass

我在使用maven进行注释处理期间使用CodeModel生成代码。 该代码用于JUnit测试:

JMethod tearDownClass = testClass.method( JMod.PUBLIC | JMod.STATIC, Void.class, "tearDownClass"); tearDownClass._throws(Exception.class); tearDownClass.annotate(AfterClass.class); <- java.lang.NoClassDefFoundError 

然而,编译过程在尝试检索java.lang.NoClassDefFoundError : org/junit/AfterClass时抛出了java.lang.NoClassDefFoundError : org/junit/AfterClass AfterClass.class ,这是一个注释本身。

对JUnit的依赖定义如下:

  junit junit 4.8.2  

所以我的代码中应该有AfterClass.class

我该如何解决这个问题?

不清楚

调用codemodel的代码位于编译库中,其中junit不是“测试”依赖项。 但是,调用生成代码的代码具有相同的junit依赖性,但作为测试依赖性。

如果我将后一个依赖项更改为“not-a-test”依赖项,则问题就会消失。 为什么我必须将此依赖项定义为“not-a-test”,尽管只有调用codemodel的库明确使用它?

编辑

这是依赖树:

 net.dwst:codegentest:jar:1.0.0 +- junit:junit:jar:4.8.2:compile +- org.sonatype.maven.plugin:emma-maven-plugin:jar:1.2:test | +- emma:emma:jar:2.0.5312:test | \- org.apache.maven.reporting:maven-reporting-impl:jar:2.0.4:test | +- commons-validator:commons-validator:jar:1.2.0:test | | +- commons-beanutils:commons-beanutils:jar:1.7.0:test | | +- commons-digester:commons-digester:jar:1.6:test | | | \- commons-collections:commons-collections:jar:2.1:test | | \- commons-logging:commons-logging:jar:1.0.4:test | +- org.apache.maven.doxia:doxia-core:jar:1.0-alpha-7:test | +- oro:oro:jar:2.0.7:test | \- org.apache.maven.doxia:doxia-site-renderer:jar:1.0-alpha-7:test | +- org.codehaus.plexus:plexus-i18n:jar:1.0-beta-6:test | +- org.codehaus.plexus:plexus-velocity:jar:1.1.2:test | | +- commons-logging:commons-logging-api:jar:1.0.4:test | | \- velocity:velocity:jar:1.4:test | | \- velocity:velocity-dep:jar:1.4:test | \- org.apache.maven.doxia:doxia-decoration-model:jar:1.0-alpha-7:test +- net.dwst:generics:jar:1.3.0:compile | +- org.swinglabs:swing-layout:jar:1.0.3:compile | \- com.sun.codemodel:codemodel:jar:2.4.1:compile +- net.flat:flat:jar:1.3.0:compile | \- com.pyx4me:proguard-maven-plugin:jar:2.0.4:compile | +- ant:ant:jar:1.6.5:compile | +- org.apache.maven:maven-archiver:jar:2.3:compile | +- org.codehaus.plexus:plexus-archiver:jar:1.0-alpha-9:compile | \- org.codehaus.plexus:plexus-io:jar:1.0-alpha-1:compile +- org.codehaus.mojo:build-helper-maven-plugin:jar:1.7:compile | +- org.apache.maven:maven-model:jar:2.0.6:compile | +- org.apache.maven:maven-project:jar:2.0.6:compile | | +- org.apache.maven:maven-settings:jar:2.0.6:compile | | +- org.apache.maven:maven-profile:jar:2.0.6:compile | | +- org.apache.maven:maven-artifact-manager:jar:2.0.6:compile | | +- org.apache.maven:maven-plugin-registry:jar:2.0.6:compile | | \- org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile | +- org.apache.maven:maven-core:jar:2.0.6:compile | | +- org.apache.maven.wagon:wagon-file:jar:1.0-beta-2:runtime | | +- org.apache.maven:maven-plugin-parameter-documenter:jar:2.0.6:compile | | +- org.apache.maven.wagon:wagon-http-lightweight:jar:1.0-beta-2:runtime | | | +- org.apache.maven.wagon:wagon-http-shared:jar:1.0-beta-2:runtime | | | \- xml-apis:xml-apis:jar:1.0.b2:runtime | | +- org.apache.maven.reporting:maven-reporting-api:jar:2.0.8:compile | | | \- org.apache.maven.doxia:doxia-sink-api:jar:1.0-alpha-7:compile | | +- org.apache.maven.wagon:wagon-provider-api:jar:1.0-beta-2:compile | | +- org.apache.maven:maven-repository-metadata:jar:2.0.6:compile | | +- org.apache.maven:maven-error-diagnostics:jar:2.0.6:compile | | +- commons-cli:commons-cli:jar:1.0:compile | | +- org.apache.maven.wagon:wagon-ssh-external:jar:1.0-beta-2:runtime | | | \- org.apache.maven.wagon:wagon-ssh-common:jar:1.0-beta-2:runtime | | +- org.apache.maven:maven-plugin-descriptor:jar:2.0.6:compile | | +- org.codehaus.plexus:plexus-interactivity-api:jar:1.0-alpha-4:compile | | +- org.apache.maven:maven-monitor:jar:2.0.6:compile | | +- org.apache.maven.wagon:wagon-ssh:jar:1.0-beta-2:runtime | | | \- com.jcraft:jsch:jar:0.1.27:runtime | | \- classworlds:classworlds:jar:1.1:compile | +- org.apache.maven:maven-plugin-api:jar:2.0.6:compile | +- org.apache.maven:maven-artifact:jar:2.0.6:compile | \- org.codehaus.plexus:plexus-utils:jar:1.5.8:compile \- org.bsc.maven:maven-processor-plugin:jar:2.0.3:compile \- org.jfrog.maven.annomojo:maven-plugin-tools-anno:jar:1.4.0:compile +- org.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0:compile +- org.apache.maven.plugin-tools:maven-plugin-tools-api:jar:2.6:compile | \- jtidy:jtidy:jar:4aug2000r7-dev:compile \- com.sun:tools:jar:1.5.0:system 

很奇怪:

 +- net.dwst:generics:jar:1.3.0:compile | +- org.swinglabs:swing-layout:jar:1.0.3:compile | \- com.sun.codemodel:codemodel:jar:2.4.1:compile 

不包含org.junit ,是的,这个库的pom.xml有:

  junit junit 4.8.2  ... 

如果我理解你的情况,你有两个库(A和B):

A是调用codemodel的代码。 这依赖于junit 4.8.2(编译范围)。

B是调用A(生成代码)的代码。 这依赖于junit 4.8.2(测试范围)。

显然,B依赖于A.

从Maven依赖范围 ,我们有以下行,

每个范围(导入除外)以不同方式影响传递依赖性,如下表所示。 如果将依赖项设置为左列中的作用域,则该依赖项与顶行中作用域的传递依赖性将导致主项目中的依赖项,其中作用域列在交集处。 如果未列出范围,则表示将省略依赖关系。

传递依赖是来自直接依赖的依赖。 所以库X依赖于库Y.库Y依赖于库Z.所以Z是库X的传递依赖。

在您的情况下,B都直接依赖于junit(具有测试范围)并且通过A在junit上具有传递依赖性(具有编译范围)。 如果我们读取表格,我们可以看到这意味着优先考虑的范围是测试 。 这就是您的代码无法找到AfterClass.class的原因,因为它不会被包含在内。

您最好的选择是将范围设置为您已经尝试过的编译范围。