2014-10-08 3 views
4

Итак, я искал SO в течение нескольких часов и часов, и я полностью бегу в кирпичную стену здесь.maven: исключить jar из JDK

Моя проблема довольно проста: у меня есть (довольно большой) проект, который я хотел бы построить с Maven (так что я могу автоматизировать все это немного). Пока все работает нормально, кроме одной серьезной проблемы.

У меня есть зависимость, называемая «java-plugin». Я не знаю точно, источник или автор, но она зависела от зависимостей моей - я добавил ее к нашей собственной третьей стороне Nexus хранилище с именем, которое было указано в оригинальной банке.

Этот плагин будет добавлен от моей Nexus без каких-либо проблем, но она имеет следующую структуру:

- netscape 
    -- javascript 
     JSException.class 
     JSObject.class 
     JSUtil.class 
    -- security 
     ForbiddenTargetException.class 
     ParameterizedTarget.class 
     Principal.class 
     Privilege.class 
     PrivilegeManager.class 
     PrivilegeTable.class 
     Target.class 
     UserDialogHelper.class 
     UserTarget.class 
- sun 
    -- plugin 
     ... 
    -- plugin2 
     ... 
- com.sun.java.browser.plugin2 
    ... 

В чем проблема? Пока я работал в проекте на основе Eclipse, я поместил свой JDK в качестве «последнего» в моем пути к классам. Теперь это Maven и, по-видимому, Maven размещает JDK в первую очередь. В моем JDK у меня есть jfxrt.jar (часть Java FX). Этот также содержит объект netscape.javascript.JSObject (а также объект netscape.javascript.JSException). С другой стороны, он не содержит объекта netscape.javascript.JSUtil. Итак, Maven собирает JSObject и JSException из библиотеки JDK, а другие классы он выбирает из моей собственной зависимости от java-plugin.

Конечно, оба класса не совпадают. Конечно, теперь я получаю ошибки компиляции, поскольку зависимость java-plugin содержит метод getWindow в классе JSObject, где нет библиотеки JDK.

Идеальная ситуация заключалась бы в исключении из Maven jfxrt.jar, но у меня нет абсолютно никакой идеи о том, как это сделать. Любое другое решение тоже сделало бы, если бы я мог построить этот с Maven. Примечание. Я бы предпочел не использовать механизм «одобрения» в Java, если это возможно, поскольку это потребует многократной загрузки этой библиотеки на несколько разных серверов и вызовет огромные задержки при развертывании (поскольку нам всегда приходилось отправил файл в нашу службу поддержки для еще одной загрузки).

Спасибо!


EDIT

Итак, мой плагин зависимость является то, что также в JDK - еще лучше! Мне не нужен мой java-плагин, у меня достаточно с моим JDK, который включает plugin.jar автоматически (это в моем ${java.home}/lib/plugin.jar).

Сейчас такая ситуация:

Dependency problem in Maven

Как вы можете видеть, jfxrt.jar приходит первым, перед plugin.jar. Я вижу, почему Maven или Java в целом перестают смотреть, как только он находит первый netscape.javascript.JSObject (который находится в jfxrt.jar). Но мне действительно нужно загрузить второй класс JSObject (к сожалению, он находится в том же пакете и с тем же именем). Как, черт возьми, я должен это делать? И почему это работает без очарования в Eclipse, когда я не использовал Maven, и почему он не работает в IntelliJ вместе с Maven?

Заранее благодарен!

+0

Посмотрите, могут ли [эти предложения] (http://maven.40175.n5.nabble.com/Removing-JDK-from-compile-classpath-td5713254.html) работать на вас (я понятия не имею об этих, Я их нашел). – watery

+0

Нет, они не помогли, но я подумал, что это главная проблема IntelliJ, а не проблема Maven. Потерял пару часов на этом ... Спасибо! – testuser

ответ

2

Хорошо, поэтому я понял. По-видимому, это была гораздо больше проблема IntelliJ, чем проблема класса.

Так IntelliJ автоматически добавляет полный JDK (включая все банки в/jre/lib) к пути к классам - во-первых, перед всеми зависимостями Maven. Так что мой проект был странным: у меня был netscape.javascript.JSObject в jfxrt.jar, в plugin.jar и в моем плагине Maven (эти банки были добавлены в этом порядке). Первый найденный JSObject был найден в jfxrt.jar, что вызвало эту проблему.

Он работал в Eclipse, как и там, я мог бы изменить порядок пути к классам и добавил мой Maven плагин ПЕРЕД JDK - поэтому порядок стал java-plugin.jar (первый один, правильный класс JSObject), jfxrt.jar, plugin.jar.

Это сработало бы, если бы я использовал старый JDK - этот jfxrt.jar был добавлен только в JDK7.

Это работает на Дженкинса, если у меня все еще есть мой java-plugin.jar от Maven, потому что Дженкинс автоматически не добавляет библиотеки JDK (только ядро). Это было, как я очистил его:

  • Я удалил мой java.plugin.jar и заменить его на зависимости от plugin.jar.

    <dependency> 
        <groupId>com.sun.jdk</groupId> 
        <artifactId>plugin</artifactId> 
        <version>${version.java-plugin}</version> 
        <type>jar</type> 
        <scope>system</scope> 
        <systemPath>${java.home}/lib/plugin.jar</systemPath> 
    </dependency> 
    
  • Я все еще была проблема в IntelliJ, но прибыл, чтобы удалить jfxrt.jar из импортируемых библиотек JDK в самой IntelliJ - что делает изменения .iml файл, но, конечно, не все, что было бы использования для Дженкинса. (Вы можете отредактировать эти параметры, щелкнув правой кнопкой мыши папку «Внешние библиотеки»> < 1.7 в обозревателе проектов, а затем нажмите Open Library Settings).

  • После того, как jfxrt.jar был удален, все сработало. Я рассуждал, что это ничего не изменит в Дженкинсе, но, с другой стороны, проблема, возможно, даже не будет существовать у Дженкинса. Поэтому я просто попробовал и передал свой код SVN, чтобы построить его на Jenkins.

Волшебно, теперь это работает и на Дженкинсе. Я пробовал и удалял свою зависимость от plugin.jar, тогда я получаю классическую ошибку компиляции «не могу найти символ» на Jenkins, в то время как я не получаю эту ошибку в IntelliJ из-за автоматического импорта JDK в путь к классам.

Короче говоря: редактируя настройки моего проекта в IntelliJ, я получил его работу на месте, просто доверяя Maven, я получил его работу над Дженкинсом, как и должно быть.

Смежные вопросы