m2e: Папка, содержащая _sources_ java, должна использоваться несколькими проектами m2e

У меня есть ситуация, когда мне нужно иметь папку, содержащую источники Java, используемые в качестве исходной папки для нескольких проектов maven «рядом друг с другом» в древовидной структуре. Из-за различий в зависимости для проектов maven я не могу создать артефакт, содержащий скомпилированную версию источников, но мне нужно, чтобы каждый проект рассматривал его как исходную папку в дополнение к src / main / java.

Очевидно, Maven может сделать это легко, добавив еще одну исходную папку, расположенную в "../foo/src", но m2e отказывается это делать, и для того, чтобы это хорошо работало для нас, мне нужно, чтобы она работала в Eclipse.

Как бы я мог создать такую ​​структуру, как:

/common/src
/a/pom.xml  (add source folder ../common/src)
/a/src/main/java/...
/b/pom.xml  (add source folder ../common/src)
/b/src/main/java/....

и заставить его работать в Eclipse?

(примечание: мне известно о http://dev.eclipse.org/mhonarc/lists/m2e-users/msg01988.html - правда, с 2011 г.)


person Thorbjørn Ravn Andersen    schedule 24.05.2013    source источник
comment
Вы пробовали подключаемый модуль Maven build-helper?   -  person noahlz    schedule 24.05.2013
comment
@noahz Работает из командной строки.   -  person Thorbjørn Ravn Andersen    schedule 24.05.2013


Ответы (6)


Вы не должны этого делать.

Если вы хотите использовать этот код в разных модулях, это также должен быть модуль Maven, используемый в качестве зависимости другими модулями.

Основная проблема с тем, что вы пытаетесь сделать, заключается в том, что, хотя это не фактическое копирование / вставка источников между двумя модулями, в конечном итоге он ведет себя как один. Что произойдет, когда вы построите две банки? У вас будут повторяющиеся классы, поэтому, если вы используете их в одном приложении, путь к классам будет немного неправильным.

Итак, чего именно вы пытаетесь достичь?

  • Повторно использовать какой-то код в двух разных модулях? Затем используйте его как зависимую банку.
  • Повторно использовать код в двух разных модулях, но вы не хотите, чтобы в итоге получилось несколько банок? Затем вы можете использовать maven-shade-plugin, чтобы встроить зависимость в последний артефакт.
  • Создать две немного разные версии одной и той же библиотеки? Затем вы можете снова использовать maven-shade-plugin, чтобы расширить одну банку дополнительными источниками. Или вы можете использовать аспектj-maven-plugin для добавления аспектов в базовый набор классов.
  • У вас есть дизайн кода, который запускал бы циклическую зависимость, поскольку модули зависят от общего кода, который, в свою очередь, зависит от кода каждого модуля? Правильным исправлением было бы извлечение универсального API из модулей, который перешел бы в общую зависимость и был бы реализован по-разному каждым модулем.

Если вам действительно действительно нужно сохранить его как общий исходный каталог, а не общую зависимость, вы можете посмотреть этот ответ.

person Sergiu Dumitriu    schedule 01.06.2013
comment
Мне нужен общий источник кода, используемый в трех проектах, и по техническим причинам источник также должен иметь возможность видеть источник проекта, который его использует. Причина в том, что нам, возможно, придется предоставить несколько разные версии одного и того же двоичного файла разным ветвям данного клиента. Если у меня просто зависимая банка, я не могу ссылаться на проект src / main / java, в котором живет конкретный класс проекта (но нужно прибегать к фабрикам и / или внедрению зависимостей, которые не понадобятся при более простом подходе). Также здесь не проблема повторяющихся классов. - person Thorbjørn Ravn Andersen; 01.06.2013
comment
Понятно, значит, вы пытаетесь избежать как круговой зависимости, так и полагаться на сложную структуру для разделения реализации API. Я считаю, что внедрение зависимостей - очень хорошее дизайнерское решение для любого проекта, которое сделало бы будущую разработку намного более модульной. Но я не знаю, насколько велик ваш проект, чтобы рекомендовать его адаптировать сейчас. Поэтому я бы порекомендовал простую фабрику, которую довольно легко реализовать и которая не усложняет код. Взлом файловой системы для создания общего исходного каталога для меня - это запах кода, это ваше решение, хотите вы жить с ним или нет. - person Sergiu Dumitriu; 01.06.2013
comment
Обратите внимание, что это отлично работает с Maven, вызываемым из командной строки, abeit при использовании расширения для добавления дополнительных исходных jar-файлов. Открыто для обсуждения, является ли это ошибкой или функцией. Сейчас я согласен, что это не выглядит возможным. - person Thorbjørn Ravn Andersen; 01.06.2013

Как насчет небольшой хитрости с файловой системой? Просто сделайте символические ссылки на папки, и у вас все будет хорошо :)

Для NTFS вы можете попробовать сделать mklink из командной строки. Дополнительные объяснения здесь: http://en.wikipedia.org/wiki/NTFS_symbolic_link

person WeMakeSoftware    schedule 31.05.2013
comment
Как мне сделать это с NTFS? - person Thorbjørn Ravn Andersen; 31.05.2013

Вы должны иметь возможность использовать относительные пути и Maven Build Helper в качестве решения.

В каждый проект или в «родительский» файл pom.xml, от которого они все наследуют, добавьте следующее:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.8</version>
    <executions>
      <execution>
        <id>add-source</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>add-source</goal>
        </goals>
        <configuration>
          <sources>
            <source>${basedir}/../../common/src</source>
          </sources>
        </configuration>
      </execution>
    </executions>
  </plugin>
person noahlz    schedule 24.05.2013
comment
Должно быть достаточно легко узнать. Я использую IntelliJ ;-) - person noahlz; 25.05.2013
comment
Вопрос в том, как заставить работать с m2e в eclipse. У меня он работает из командной строки. - person Thorbjørn Ravn Andersen; 25.05.2013
comment
Хорошо, я неправильно понял, что ваш вопрос действительно касался плагина m2e. - person noahlz; 25.05.2013

Если вы используете Subversion, вероятно, наиболее удобным подходом было бы сохранить общую исходную папку в отдельном репозитории и добавить ее ко всем проектам, которые в ней нуждаются, с помощью svn:externals. С другой стороны, это усложнило бы создание тегов и веток.

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

person Nicola Musatti    schedule 31.05.2013
comment
Извините но нет. Это в git. - person Thorbjørn Ravn Andersen; 31.05.2013

Почему бы просто не сделать общую библиотеку Maven <dependency /> в pom.xml других проектов и использовать функцию m2e «Разрешение зависимостей из проектов рабочей области» (которая, как мне кажется, используется по умолчанию) в зависимых проектах (щелкните правой кнопкой мыши проект => проект properties => Maven)?

Таким образом, зависимые проекты будут автоматически видеть классы общей библиотеки в среде IDE, без необходимости создавать / устанавливать артефакт общей библиотеки в репозиторий maven (локальный или удаленный).

Поскольку вы используете Git, ветвление, вероятно, упростит вам предоставление отдельных версий (версии, как в pom.xml) общей библиотеки и ссылки на эти версии соответственно в <dependency /> элементах зависимых проектов.

person Jukka    schedule 03.06.2013
comment
В первую очередь потому, что я хотел бы, чтобы общий код мог видеть код в src/main/java для каждого проекта, другими словами, отдельный пул для каждого проекта. - person Thorbjørn Ravn Andersen; 04.06.2013

Я бы использовал NTFS Junction.

Я использую их в своих проектах, чтобы делиться ресурсами между проектами, не копируя их. Соединение похоже на черную дыру между диском и файловыми системами. Они ведут себя так же, как жесткие ссылки, но могут ссылаться на папки даже на разных дисках (включая сетевые). С вашей точки зрения, это будет выглядеть так, как если бы в папке ваших проектов была папка / common / src (тогда вы можете указать Eclipse использовать ее в качестве исходной папки). Конечно, вы можете переименовать точки соединения, так что / common / src, как видно из проекта a, будет называться common.

/common/src
/a/src
/a/common <- this is a junction to /common/src

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

person namero999    schedule 04.06.2013