我有一个多模块项目,像这样:
main-project/
module1/
module2/
sub-module1/
sub-module2/
sub-module3/
...
module3/
module4/
...
Run Code Online (Sandbox Code Playgroud)
我需要在Maven2中定义一组属性(取决于我想要释放项目的环境).我不会使用<properties>因为有很多属性...因此,我使用Properties Maven2插件.
属性文件位于main-project/目录中.如何在主pom.xml中设置正确的目录,以便为任何子项指定在哪里找到属性文件?
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<files>
<file>???/env_${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
如果我只设置<file>env_${env}.properties</file>,那么当Maven2编译第一个模块时,它将找不到该main-project/env_dev.properties文件.如果我设置<file>../env_${env}.properties</file>,那么将在父级别或任何子模块级别引发错误...
我想使用maven-dependency-plugin将我的多模块项目的所有子模块中的EAR文件复制到相对于整个项目的根目录的目录.
也就是说,我的布局看起来与此类似,名称已更改:
to-deploy/
my-project/
ear-module-a/
ear-module-b/
more-modules-1/
ear-module-c/
ear-module-d/
more-modules-2/
ear-module-e/
ear-module-f/
...
Run Code Online (Sandbox Code Playgroud)
我希望所有的EAR文件都从它们各自模块的目标目录中复制到my-project/../to-deploy最后
to-deploy/
ear-module-a.ear
ear-module-b.ear
ear-module-c.ear
ear-module-d.ear
ear-module-e.ear
ear-module-f.ear
my-project/
...
Run Code Online (Sandbox Code Playgroud)
我可以在每个耳模块中使用相对路径来完成它,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>install</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>ear</type>
<outputDirectory>../../to-deploy</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但我宁愿不在<outputDirectory>元素中指定相对路径.我更喜欢类似的东西${reactor.root.directory}/../to-deploy,但我找不到这样的东西.
此外,我更喜欢有一些方法来继承这个maven-dependency-plugin配置,所以我不必为每个EAR模块指定它.
我还尝试从根pom继承自定义属性:
<properties>
<myproject.root>${basedir}</myproject.root>
</properties>
Run Code Online (Sandbox Code Playgroud)
但是当我试图${myproject.root}在耳模块POM中使用时,${basedir}它将解析为耳模块的基础.
另外,我找到了http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/,其中建议每个开发人员,大概是连续的集成服务器应该在profiles.xml文件中配置根目录,但我不认为它是一个解决方案.
那么有一种简单的方法可以找到多模块项目的根目录吗?
我正在使用Maven中描述的本地存储库:通过相对路径向jar添加依赖项.
repository-url在最顶层定义pom.xml为
<url>file:${basedir}/../3rdParty/maven-repository</url>
Run Code Online (Sandbox Code Playgroud)
此外,最顶层pom.xml定义了2个模块
<modules>
<module>sub1</module>
<module>sub2</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
问题是,如果一个模块(比如说sub1)定义了一个应该从存储库下载的依赖项,并且maven是从最顶层的目录调用的,那么${basedir}它不会设置到这个目录,而是设置为sub1,导致错误的存储库URL.
所以,说最顶层的项目就pom.xml在
/Development/myproject/pom.xml
Run Code Online (Sandbox Code Playgroud)
存储库在
/Development/3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
然后应将存储库URL设置为
/Development/myproject/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
但事实证明它被设定为
/Development/myproject/sub1/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
这当然不存在.
知道为什么会这样吗?
使用maven-eclipse-plugin,mvn eclipse:eclipse您可以指定eclipse 项目性质和构建器,它们将自动添加到eclipse项目中.
早期版本的m2eclipse使用了maven-eclipse-plugin的配置块,并且还允许您使用相同的机制激活自然和构建器.这似乎不再是这种情况因为a)我maven-eclipse-plugin在m2eclipse来源中找不到任何引用而b)它只是不起作用:-)
所以这是我的问题:有没有办法从pom.xml配置m2eclipse生成的eclipse项目?具体来说:项目建设者和性质,但我也对其他选项感兴趣.