Подтвердить что ты не робот

Как сообщить 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?

4b9b3361

Ответ 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, и только что построенное рабочее пространство, на этот раз взяв банку из хранилища вместо ссылки на проект