тест mvn приводит к NoClassDefFoundError, хотя он находится в пути к классу

#java #maven #jar #jena #xerces

#java #maven #jar #jena #xerces

Вопрос:

сначала немного объяснений по проекту. Я создаю https://github.com/paulhoule/infovore/tree/v1.1.1 и возникли проблемы с maven. Однако это происходит только на машине Debian 3.2.57, в то время как он работает на машине Ubuntu 13.04. Вот почему я не сообщаю о проблеме со связанными проектами, но хотел бы узнать способы ее отладки.

Несколько тестов завершаются неудачно mvn test из-за одного и того же ClassDefNotFoundError . Некоторые выдержки из отчетов surefire:

  <error message="org/apache/xerces/xs/XSTypeDefinition" type="java.lang.NoClassDefFoundError">java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSTypeDefinition
    at com.ontology2.millipede.triples.PartitionOnSubjectTTest.testBin(PartitionOnSubjectTTest.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSTypeDefinition
    at com.hp.hpl.jena.n3.turtle.ParserBase.<init>(ParserBase.java:25)
    at com.ontology2.rdf.parser.NodeParser.<init>(NodeParser.java:337)
  

Однако соответствующий jar находится в пути к классу, как mvn test -X показано:

 [DEBUG] test classpath classpath:
[DEBUG]   /home/semmul2/tools/infovore-1.1/millipede/target/test-classes
[DEBUG]   /home/semmul2/tools/infovore-1.1/millipede/target/classes
[DEBUG]   /home/semmul2/.m2/repository/junit/junit/4.11/junit-4.11.jar
[DEBUG]   /home/semmul2/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
[DEBUG]   /home/semmul2/.m2/repository/com/google/guava/guava/14.0.1/guava-14.0.1.jar
[DEBUG]   /home/semmul2/.m2/repository/org/springframework/spring-context/3.2.1.RELEASE/spring-context-3.2.1.RELEASE.jar
[DEBUG]   /home/semmul2/.m2/repository/org/springframework/spring-beans/3.2.1.RELEASE/spring-beans-3.2.1.RELEASE.jar
[DEBUG]   /home/semmul2/.m2/repository/org/springframework/spring-aop/3.2.1.RELEASE/spring-aop-3.2.1.RELEASE.jar
[DEBUG]   /home/semmul2/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar
[DEBUG]   /home/semmul2/.m2/repository/org/springframework/spring-expression/3.2.1.RELEASE/spring-expression-3.2.1.RELEASE.jar
[DEBUG]   /home/semmul2/.m2/repository/org/springframework/spring-core/3.2.1.RELEASE/spring-core-3.2.1.RELEASE.jar
[DEBUG]   /home/semmul2/.m2/repository/org/apache/jena/jena-arq/2.9.3/jena-arq-2.9.3.jar
[DEBUG]   /home/semmul2/.m2/repository/org/apache/jena/jena-core/2.7.3/jena-core-2.7.3.jar
[DEBUG]   /home/semmul2/.m2/repository/org/apache/jena/jena-iri/0.9.3/jena-iri-0.9.3.jar
--> [DEBUG]   /home/semmul2/.m2/repository/xerces/xercesImpl/2.10.0/xercesImpl-2.10.0.jar**
[DEBUG]   /home/semmul2/.m2/repository/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar
[DEBUG]   /home/semmul2/.m2/repository/commons-codec/commons-codec/1.5/commons-codec-1.5.jar
[DEBUG]   /home/semmul2/.m2/repository/org/apache/httpcomponents/httpclient/4.1.2/httpclient-4.1.2.jar
[DEBUG]   /home/semmul2/.m2/repository/org/apache/httpcomponents/httpcore/4.1.3/httpcore-4.1.3.jar
[DEBUG]   /home/semmul2/.m2/repository/org/slf4j/slf4j-api/1.6.4/slf4j-api-1.6.4.jar
[DEBUG]   /home/semmul2/.m2/repository/org/slf4j/slf4j-log4j12/1.6.4/slf4j-log4j12-1.6.4.jar
[DEBUG]   /home/semmul2/.m2/repository/log4j/log4j/1.2.16/log4j-1.2.16.jar
[DEBUG]   /home/semmul2/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar
  

И взгляд в соответствующий jar показывает, что класс действительно там:

 jar tf  /home/semmul2/.m2/repository/xerces/xercesImpl/2.10.0/xercesImpl-2.10.0.jar | grep XSTypeDefinition
>> org/apache/xerces/xs/XSTypeDefinition.
  

Соответствующий pom.xml выглядит примерно так:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>infovore</artifactId>
    <groupId>com.ontology2</groupId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.ontology2</groupId>
  <artifactId>millipede</artifactId>
  <version>1.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>millipede</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>14.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.jena</groupId>
      <artifactId>jena-arq</artifactId>
      <version>2.9.3</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
  </dependencies>
</project>
  

После предложения Роба Холла я также попытался поместить один из неудачных тестов в jar и выполнить тестовый код в качестве основной функции. Это результат:

 java -cp millipede-1.1-SNAPSHOT.jar com.ontology2.rdf.parser.NodeParserTest
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSTypeDefinition
        at com.hp.hpl.jena.n3.turtle.ParserBase.<init>(ParserBase.java:25)
        at com.ontology2.rdf.parser.NodeParser.<init>(NodeParser.java:337)
        at com.ontology2.rdf.parser.NodeParserTest.main(NodeParserTest.java:18)
Caused by: java.lang.ClassNotFoundException: org.apache.xerces.xs.XSTypeDefinition
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more
  

Я уже пробовал:

  • Удаление полного локального репозитория во избежание конфликтов с другими проектами

  • Явное добавление зависимости xerces

  • Сравнил версии maven и java, а также переменные среды с рабочей машиной

Любые другие идеи приветствуются! 🙂

Комментарии:

1. На отказавшей машине это: /usr/lib/jvm/java-7-openjdk-amd64 на проходящей машине это: /usr/lib/jvm/java-7-openjdk-i386

2. Вы проверяли, действительно ли извлекаемая версия xerxes содержит запрошенный класс? У вас может быть более новая / более старая версия xerxes, которая несовместима со всеми элементами, которые зависят от нее. Maven исключит все экземпляры транзитивной зависимости, кроме одного, если ваши прямые зависимости зависят от разных версий. В eclipse m2e вы можете просмотреть свои транзитивные зависимости, чтобы узнать, исключается ли версия. Вы также можете изучить сам jar через Project Explorer, чтобы проверить, присутствует ли класс.

3. Вы явно не указываете версию плагина компилятора, поэтому среда выполнения maven использует значение по умолчанию. Может ли это быть ошибкой в дистрибутиве maven для конкретной платформы? Что mvn --version говорит о каждой из двух целевых платформ? Можете ли вы использовать grep для maven-compiler-plugin: вывода вашей сборки, чтобы мы также могли видеть вызванную версию компилятора?

4. спасибо за все эти идеи! Однако мне очень жаль, но я могу снова получить доступ к неисправной машине только в пятницу утром, поэтому я могу попробовать их только тогда.

5. Одна дополнительная информация для полноты, чтобы дать вам полную картину: этот проект является подмодулем другого проекта, поэтому есть родительский pom.xml . Однако это указывает только модули и устанавливает исходную и целевую версию компилятора на 1.7. В любом случае, при выполнении из родительского проекта возникает точно такая же ошибка.