m2e:包含java _sources_的文件夹需要由几个m2e项目使用

时间:2013-05-24 11:31:06

标签: java eclipse maven m2eclipse 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年开始)

6 个答案:

答案 0 :(得分:10)

你应该那样做。

如果你想在不同的模块中使用该代码,那么它也应该是一个Maven模块,用作其他模块的依赖。

您尝试做的主要问题是即使它不是两个模块之间的实际复制/粘贴源,但它最终表现得像一个。一旦你建造了两个罐子会发生什么?你会有重复的类,所以如果你在同一个应用程序中使用它们,类路径就会有点错误。

那么,你究竟想要完成的是什么?

  • 在两个不同的模块中重用一些代码?然后将它用作依赖jar。
  • 在两个不同的模块中重用代码,但您不想最终使用多个jar?然后,您可以使用maven-shade-plugin将依赖项嵌入到最终工件中。
  • 构建同一个库的两个略有不同的版本?然后你可以再次使用maven-shade-plugin来扩展一个带有其他来源的jar。或者,您可以使用aspectj-maven-plugin将方面注入基类集。
  • 有一个会触发循环依赖的代码设计,因为模块依赖于公共代码,而公共代码又取决于每个模块的代码?正确的解决方法是从模块中提取通用API,这些API将进入共享依赖关系,并且每个模块将以不同方式实现。

如果您真的必须将其保留为共享源目录而不是共享依赖项,那么您可以查看this answer

答案 1 :(得分:3)

文件系统的小技巧怎么样? 只需对文件夹进行符号链接,你就可以了:)

对于NTFS,您可以尝试从命令行执行mklink。 这里有更多解释:http://en.wikipedia.org/wiki/NTFS_symbolic_link

答案 2 :(得分: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>

答案 3 :(得分:1)

如果您使用Subversion,最方便的方法可能是将共享源文件夹保存在单独的存储库中,并通过svn:externals将其添加到需要它的所有项目中。另一方面,这会使创建标签和分支更加复杂。

使用Mercurial子存储库可能会实现类似的功能,但它不会那么方便。

答案 4 :(得分:1)

为什么不简单地在其他项目'<dependency />中使公共库成为Maven pom.xml并使用m2e中的“从工作空间项目中解析依赖项”功能(我相信这是默认值)在依赖项目中(右键单击project =&gt;项目属性=&gt; Maven)?

这样,依赖项目会自动查看IDE中公共库的类,而不必实际构建/安装公共库工件到maven存储库(本地或远程)。

由于您使用的是Git,因此分支可能会使您轻松提供公共库中的不同版本(pom.xml中的版本),并在相关项目中{{1}相应地引用这些版本} elements。

答案 5 :(得分:1)

我会使用NTFS Junction

我在项目中使用它们在项目之间共享资源而不实际复制它们。交叉点就像驱动器和文件系统之间的黑洞。它们的行为与硬链接相同,但可以引用文件夹,即使在不同的驱动器(包括网络驱动器)上也是如此。从您的角度来看,它看起来像在您的项目文件夹中有/ common / src文件夹(然后您可以告诉Eclipse将其用作源文件夹)。当然,您可以重命名交接点,以便项目a看到的/ common / src将被称为common

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

为了简化Junction的创建,我非常想使用this shell extension