2013-05-24 2 views
13

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

Очевидно, что 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 года)

+0

Вы пробовали [Maven build-helper plugin] (http://mojo.codehaus.org/build-helper-maven-plugin/)? – noahlz

+0

@noahz Работает из командной строки. –

ответ

1

Вы должны быть в состоянии использовать относительные пути и 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> 
+0

Так это работает с m2e в Eclipse? –

+0

Должно быть достаточно легко узнать. Я использую IntelliJ ;-) – noahlz

+0

Вопрос в том, как заставить его работать с m2e в eclipse. Я работаю из командной строки. –

3

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

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

+0

Как мне это сделать с NTFS? –

+0

обновлен ответ – WeMakeSoftware

1

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

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

+0

Извините, нет. Это в git. –

10

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

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

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

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

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

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

+0

Мне нужен источник общего кода, используемый в трех проектах, и по техническим причинам источник также должен иметь возможность видеть источник проекта, который его использует. Причина в том, что нам, возможно, придется предоставить несколько разные версии одного и того же двоичного кода для разных ветвей клиента. Если у меня просто есть зависимая баночка, я не могу ссылаться на проект src/main/java, где живет конкретный класс проекта (но нужно прибегать к фабрикам и/или инъекции зависимостей, которые не нужны для более простого подхода). Также дублирующие классы здесь не являются проблемой. –

+0

Я вижу, поэтому вы пытаетесь избежать как циклической зависимости, так и полагаться на сложную структуру для разделения API. Я считаю, что инъекция зависимостей является очень хорошим дизайнерским решением для любого проекта, что сделает будущее развитие более модульным.Но я не знаю, насколько большой ваш проект уже должен рекомендовать адаптировать это сейчас. Поэтому я бы порекомендовал простую фабрику, которую довольно легко реализовать и не будет усложнять код. Хакер файловой системы, чтобы иметь общий исходный каталог, является запахом кода для меня, это ваше решение, если вы хотите жить с ним или нет. –

+0

Обратите внимание, что это отлично работает с Maven, вызванным из командной строки, при использовании расширения для добавления дополнительных исходных флагов. Это открыто для обсуждения, если это ошибка или функция. Сейчас я согласен, что это не выглядит выполнимым. –

1

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

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

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

+0

Прежде всего, потому что я хотел бы, чтобы общий код мог видеть код в 'src/main/java' для каждого проекта, другими словами, один пул для каждого проекта. –

1

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

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

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

Чтобы облегчить создание соединения, я очень люблю использовать this shell extension.

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