Java - правильное получение jar-зависимостей - PullRequest
4 голосов
/ 19 мая 2009

Я относительно новичок в Java и maven, и поэтому, чтобы познакомиться с ними, я решил сделать проект как средство обучения.

Я выбрал довольно общий стек:

  • Java 1.6
  • Hibernate (с аннотациями)
  • Весна (с аннотациями)
  • JUnit 4
  • Tomcat
  • Oracle XE / In-mem hsqldb

На сегодняшний день одной из самых больших проблем, с которыми я столкнулся, является правильное сочетание версий jar для получения стабильной среды. Это проблема, с которой я все еще борюсь с более двух месяцев спустя.

Довольно часто я получаю исключения noSuchMethod или classNotFound, и оказывается, что модуль Spring A x.x.x не совместим с модулем Hibernate B y.y.y. Или даже, как обычно, пружинный модуль A x.x.x не совместим с пружинным модулем B y.y.y

Я ожидал, что начиная с чистого листа, зависимости от версии должны быть минимальными - просто возьмите последнюю версию, и все должно работать ... но это не так.

Я ожидал, что использование maven упростит этот процесс, и, без сомнения, это так.

Но это, безусловно, будет далеко не безболезненно. Я бы подумал, что если для модуля A требуется конкретная версия модуля B, он должен выполняться где-то вдоль линии, и certinaly предоставляет более значимые сообщения, которые просто "noSuchMethod".

Кроме того, кажется, что единственный способ обнаружить эти проблемы - это попробовать новый вызов метода, получить страшную ошибку noSuchMethod и начать поиск в Google.

Я что-то упустил по пути здесь, что сделало это более трудным для меня, чем это должно было быть?

Для справки, вот раздел зависимостей моего pom ... если вы заметили что-то ужасно нестандартное, пожалуйста, дайте мне знать!

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.4</version>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>ojdbc</groupId>
        <artifactId>ojdbc</artifactId>
        <version>14</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency><!-- java bytecode processor -->
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.8.0.GA</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>1.8.0.7</version>
    </dependency>
    <dependency>
        <groupId>org.dbunit</groupId>
        <artifactId>dbunit</artifactId>
        <version>2.4.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.4.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>3.1.0.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.4.0.GA</version>
    </dependency>

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>
</dependencies>

Спасибо

Marty

Ответы [ 2 ]

2 голосов
/ 19 мая 2009

Одна вещь, которая мне показалась сложной, это определить, что находится в каждой упаковке, особенно из Spring.

С этой целью я обнаружил, что поддержка NetBeans для maven выдающаяся в том, что она позволяет вам узнать, какие библиотеки задействованы каждым требованием. 6.7 Бета-версия содержит графическое дерево, которое является выдающимся, и у m2eclipse также есть очень хорошее графическое дерево зависимостей. Как еще вы знаете, что spring-orm включает в себя Spring-Beans, Spring-Core, Spring-Context и Spring-TX? Вы можете запросить у maven зависимости, используя плагин для зависимостей из командной строки, но графическое представление довольно удобно. зависимость: дерево - это цель, которую вы хотите выполнить. Очевидно, что вы также можете запустить это из Netbeans или Eclipse.

Итак, в качестве примера одного из ваших столкновений:

 <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-annotations</artifactId>
   <version>3.4.0.GA</version>
 </dependency>

фактически включает hibernate-commons-annotations-3.1.0.GA, а не 3.3. Он также включает hibernate-core-3.3.0.SP1, а не 3.3.1.GA.

Я бы начал с вашего «самого большого» компонента и начал бы видеть, какие части уже включены, и добавлять только то, чего не хватает. Даже в этом случае дважды проверьте, что у вас нет дублирующейся зависимости, и при необходимости исключите дубликат, как показано в ответе на этот вопрос .

0 голосов
/ 19 мая 2009

Если вы используете eclipse, вы должны скачать плагин maven из sonatype здесь http://m2eclipse.sonatype.org/.

Это сопровождается полезной графической визуализацией ваших зависимостей (в частности транзитивных зависимостей - зависимостей, которые вы явно не определили в своем POM), а также показывает конфликтующие зависимости.

Обновление: из комментариев ниже, ваш пробег может отличаться .

...