Maven не может выполнить проект JAR, потому что беспорядок с транзитивной зависимостью - PullRequest
1 голос
/ 03 марта 2010

У меня есть 5 проектов Maven: simple-model, simple-weather, simple-persist, simple-webapp и simple-console. (Они из книги Maven Definitive Guide). simple-console зависит от simple-weather и simple-persist. simple-persist и simple-weather оба зависят от simple-model:

simple-console ---> simple-weather ----> simple-model
             \                       /
              \---> simple-persist--/

simple-console зависит от spring и hibernate, фактически зависит от банки, содержащей javax.transaction.TransactionManager. Я создаю проекты затмения для этих 5 проектов. Класс Main внутри simple-console (который вызывает метод Hibernate) прекрасно работает в eclipse. Однако, когда я пытался выполнить его с Maven s exec:java goal или java -cp (в сборе с jar-with-dependencies), я всегда получал эту ошибку: Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager

Это действительно смутило меня, потому что, хотя eclipse знает, как включить необходимые jar-файлы перед выполнением, плагины maven этого не понимают. Почему?

P / S: Я загрузил исходный код этих проектов здесь: http://seamoo.com/simple-parent.tar.gz

1 Ответ

4 голосов
/ 03 марта 2010

Если вы запустите mvn dependency:tree в simple-console , вы не увидите артефакт JTA:

[INFO] org.seamoo:simple-console:jar:1.0
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] +- org.seamoo:simple-persist:jar:1.0:compile
[INFO] |  +- org.seamoo:simple-model:jar:1.0:compile
[INFO] |  +- org.hibernate:hibernate:jar:3.2.5.ga:compile
[INFO] |  |  +- net.sf.ehcache:ehcache:jar:1.2.3:compile
[INFO] |  |  +- asm:asm-attrs:jar:1.5.3:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  |  +- cglib:cglib:jar:2.1_3:compile
[INFO] |  |  +- asm:asm:jar:1.5.3:compile
[INFO] |  |  \- commons-collections:commons-collections:jar:2.1.1:compile
[INFO] |  +- org.hibernate:hibernate-annotations:jar:3.3.0.ga:compile
[INFO] |  |  \- javax.persistence:persistence-api:jar:1.0:compile
[INFO] |  \- org.hibernate:hibernate-commons-annotations:jar:3.3.0.ga:compile
[INFO] +- org.seamoo:simple-weather:jar:1.0:compile
[INFO] |  +- log4j:log4j:jar:1.2.14:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- jaxen:jaxen:jar:1.1.1:compile
[INFO] |  |  +- jdom:jdom:jar:1.0:compile
[INFO] |  |  +- xerces:xercesImpl:jar:2.6.2:compile
[INFO] |  |  \- xom:xom:jar:1.0:compile
[INFO] |  |     +- xerces:xmlParserAPIs:jar:2.6.2:compile
[INFO] |  |     +- xalan:xalan:jar:2.6.0:compile
[INFO] |  |     \- com.ibm.icu:icu4j:jar:2.6.1:compile
[INFO] |  \- velocity:velocity:jar:1.5:compile
[INFO] |     +- commons-lang:commons-lang:jar:2.1:compile
[INFO] |     \- oro:oro:jar:2.0.8:compile
[INFO] +- org.springframework:spring:jar:2.0.7:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1:compile
[INFO] |     +- logkit:logkit:jar:1.0.1:compile
[INFO] |     +- avalon-framework:avalon-framework:jar:4.1.3:compile
[INFO] |     \- javax.servlet:servlet-api:jar:2.3:compile
[INFO] \- hsqldb:hsqldb:jar:1.8.0.7:compile

И действительно, если вы посмотрите на simple-persist/pom.xml, вы увидите, что оно было исключено:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate</artifactId>
  <version>3.2.5.ga</version>
  <exclusions>
    <exclusion>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Я предполагаю, что артефакт jta исключен, потому что полный jibernate jar (hibernate-3.2.5.ga.jar здесь) зависит от jta-1.0.1B.jar, который NOT доступен в центральном репо из-за проблем с лицензированием во время ядра hibernate ( то есть hibernate-core-3.3.0.GA.jar) зависит от jta-1.1.jar, который доступен из центра.

Причина, по которой он работает в Eclipse, заключается в том, что simple-model зависит от hibernate-annotations-3.3.0.ga.jar, который зависит от hibernate-3.2.1.GA.jar, который зависит от jta-1.0.1B.jar (что, скорее всего, имеется в вашем локальном хранилище) , Итак, поскольку в этом проекте целые зависимости спящего режима представляют собой большую неразбериху, поскольку существуют проблемы сходимости больших зависимостей, Eclipse «видит» JTA-банку (это просто удачный или неудачный побочный эффект). Но Maven нет.

Чтобы решить эту проблему, удалите исключение JTA в simple-persist/pom.xml (это быстрое и очень грязное исправление) или исправьте зависимости гибернации, чтобы они сходились (это было бы правильным исправлением):

  • используйте hibernate-core-3.3.0.SP1.jar везде, где требуется
  • используйте hibernate-annotations-3.4.0.GA.jar (зависит от первого) везде, где требуется
...