Как сообщить Maven включить зависимость jar, а не каталог источника подпроекта в Eclipse?
Я использую Apache Maven для управления моими Java-библиотеками (jar) и некоторыми проектами, использующими библиотеки. Для удобства я использую mvn eclipse:eclipse
для создания файлов проекта Eclipse, которые можно импортировать в рабочее пространство Eclipse для редактирования.
Проблемы возникают, когда я редактирую основной проект и проекты Java lib в одном рабочем пространстве Eclipse. То есть mvn eclipse:eclipse
включает зависимость src path в файле .classpath
, а не зависимость jar
, как ожидалось.
Скажем, у меня есть проект Jave lib с именем mylib
. Соответствующий файл jar mylib.jar
был развернут в приватном Maven-репо, поддерживаемом мной. Чтобы использовать mylib.jar в основном проекте, в pom.xml
включена следующая зависимость.
<!-- pom.xml for the main project -->
<dependency>
<groupId>namespace.my</groupId>
<artifactId>mylib</artifactId>
<version>[1.0, )</version>
</dependency>
mvn compile
и mvn test
работают идеально, в которых mylib.jar
автоматически загружается из моего репо. Однако при попытке mvn eclipse:eclipse
я обнаружил, что сгенерированный файл .classpath
не включает зависимость mylib.jar
, как ожидалось. Вместо этого он включает каталог исходного файла для mylib следующим образом.
<!-- .classpath file generated by mvn eclipse:eclipse -->
<classpathentry kind="src" path="/mylib"/>
Кажется, что Maven читает метаданные Eclipse и находит mylib, а основной проект сосуществует в одном рабочем пространстве. Поэтому maven включает источник для моего блага. Черт. Как я могу сказать maven игнорировать источник локального проекта и просто включить файл jar?
Ответы
Ответ 1
Я считаю, что это на самом деле потому, что они связаны с проектами в Eclipse. Поэтому, если вы щелкните правой кнопкой мыши на своем основном проекте и перейдите к Project References
, ваш проект lib должен быть отмечен галочкой.
Если вы запустите mvn eclipse:eclipse
, он автоматически добавит ссылки на проекты для любых подпроектов (модулей). Вы можете изменить это с помощью свойства useProjectReferences плагина maven eclipse.
По умолчанию используется true
, но
Если установлено значение false, плагин не будет создавать подпроекты, а вместо этого ссылаться на эти подпроекты, используя установленный пакет в локальном репозиторий
Чтобы использовать свойство, задайте свойство в вашем pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<useProjectReferences>false</useProjectReferences>
</configuration>
</plugin>
<plugins>
<build>
Или как свойство в командной строке:
mvn eclipse:eclipse -Declipse.useProjectReferences=false
Ответ 2
Мне нужно избегать включения зависимостей в качестве переопределенного проекта, но как банку.
Использование Eclipse 4.6 Neon не работает ни один из предыдущих решений.
Я отключил функцию Workspace Resolution
click on the project -> Maven -> Disable Workspace Resolution
Ответ 3
Eclipse должен знать путь к локальному хранилищу maven. Поэтому должна быть задана переменная classpath M2_REPO
. Выполните следующую команду:
mvn -Declipse.workspace=<path-to-eclipse-workspace> eclipse:add-maven-repo
Вы также можете определить новую переменную classpath внутри eclipse: в строке меню выберите Window > Preferences. Select the Java > Build Path > Classpath Variables page
.
Затем создайте проект, выполнив mvn eclipse:eclipse
Надеюсь, что это поможет!
Ответ 4
Спасибо за подсказки собачьей собаки. Да, useProjectReferences контролирует Maven как обрабатывать подпроекты - включая исходный каталог или включая файлы jar.
Я не установил плагин maven для Eclipse, поэтому добавлю следующую конфигурацию в pom.xml
. Он сообщает Maven о включении зависимости jar в локальном репозитории maven, а не в источнике. Если требуемый файл jar отсутствует в локальном репо, он будет автоматически загружен на лету.
<!-- pom.xml for the main project: include jar, not src path -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<useProjectReferences>false</useProjectReferences>
</configuration>
</plugin>
Теперь mvn eclipse:eclipse
работает как ожидалось.
Ответ 5
Просто попробуйте использовать элемент типа внутри тега зависимостей и укажите источник /jar как тип в вашем pom.xml
<!-- pom.xml for the main project -->
<dependency>
<groupId>namespace.my</groupId>
<artifactId>mylib</artifactId>
<version>[1.0, )</version>
<type>jar<type> <!-- source/jar -->
</dependency>
Ответ 6
Недавно я испытал, что это поведение вызвано версией, указанной в файлах pom.xml. Если версия lib, в которой работает ваш основной проект, доступна для затмения в рабочей области (например, проект с соответствующим pom.xml [group, artifact, version] для lib), это будет использоваться вместо ссылки на проект вытаскивания из местоположения M2REPO.
Мое решение состояло в том, чтобы изменить версию библиотеки pom.xml в рабочей области на другую версию, что позволило мне улучшить lib, в то время как основной проект по-прежнему вытащил более старую библиотеку из M2REPO.
Используя это путем выравнивания номеров версий, вы можете выполнять параллельные улучшения/изменения артефактов с небольшим количеством проблем.
Я еще не тестировал, если вам нужно запускать mvn eclipse:eclipse
каждый раз, когда вы меняете файлы lib pom.xml и основные зависимости pom.xml, но я ожидаю, что это будет так.
Ответ 7
Я попытался закрыть проект в eclipse, и только что построенное рабочее пространство, на этот раз взяв банку из хранилища вместо ссылки на проект