NoClassDefFoundError: org / junit / AfterClass во время обработки аннотации - PullRequest
1 голос
/ 10 сентября 2011

Я генерирую код с CodeModel во время обработки аннотации с maven. Этот код для тестирования 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, когда пытается получить AfterClass.class, который сам является аннотацией.

Зависимость от JUnit определяется следующим образом:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
</dependency>

так что AfterClass.class должно быть доступно в моем коде.

Как мне решить этот вопрос?

Неясные

Код, вызывающий codemodel, находится в скомпилированной библиотеке, где junit не является «тестовой» зависимостью. Однако код, вызывающий генерирующий код, имеет ту же зависимость junit, но в качестве тестовой зависимости.

Если я изменю эту последнюю зависимость на зависимость «не для теста», проблема исчезнет. Почему я должен определить эту зависимость как «не-тест», хотя только библиотека, вызывающая codemodel, явно использует ее?

EDIT

Вот дерево зависимостей:

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 этой библиотеки имеет:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
</dependency>

...

1 Ответ

1 голос
/ 11 сентября 2011

Если я правильно понимаю вашу ситуацию, у вас есть две библиотеки (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 (с областью компиляции). Если мы прочитаем таблицу, то увидим, что это означает, что область действия, которая имеет приоритет, равна test . Вот почему ваш код не может найти AfterClass.class, потому что он не будет включен.

Лучше всего установить область компиляции, как вы уже пытались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...