首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找多模块Maven反应器项目的根目录

查找多模块Maven反应器项目的根目录
EN

Stack Overflow用户
提问于 2010-06-21 20:34:47
回答 12查看 100.8K关注 0票数 80

有没有一种简单的方法可以找到多模块Maven项目的根,比如Gradle的rootDir

背景:

我想使用maven-dependency-plugin将工件从我的多模块项目的所有子模块复制到一个相对于整个项目根目录的目录。

也就是说,我的布局类似于此,名称已更改:

代码语言:javascript
复制
to-deploy/
my-project/
    module-a/
    module-b/
    more-modules-1/
        module-c/
        module-d/
    more-modules-2/
        module-e/
        module-f/
    ...

我希望将所有工件从它们各自模块的目标目录复制到my-project/../to-deploy中,因此我的结论是

代码语言:javascript
复制
to-deploy/
    module-a.jar
    module-b.jar
    module-c.jar
    module-d.jar
    module-e.jar
    module-f.jar
my-project/
    ...

我可以在每个模块中使用相对路径,如下所示:

代码语言:javascript
复制
        <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>jar</type>
                                <outputDirectory>../../to-deploy</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

但我不希望在<outputDirectory>元素中指定相对路径。我更喜欢像${reactor.root.directory}/../to-deploy这样的东西,但我找不到这样的东西。

此外,我更希望有某种方法来继承这个maven-dependency plugin配置,这样我就不必为每个模块指定它。

我还尝试从根pom继承一个自定义属性:

代码语言:javascript
复制
<properties>
    <myproject.root>${basedir}</myproject.root>
</properties>

但是,当我尝试在模块POM中使用${myproject.root}时,${basedir}将解析为模块的basedir。

此外,我发现了http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/,其中建议每个开发人员和持续集成服务器应该在profiles.xml文件中配置根目录,但我不认为这是一种解决方案。

那么,有没有一种简单的方法来找到多模块项目的根呢?

EN

回答 12

Stack Overflow用户

发布于 2018-03-28 15:11:25

从Maven3.3.1开始,您可以使用${maven.multiModuleProjectDirectory}来实现此目的。(感谢https://stackoverflow.com/a/48879554/302789)

编辑:这似乎只有当你的项目根目录下有一个.mvn文件夹时才能正常工作。

票数 54
EN

Stack Overflow用户

发布于 2012-01-13 17:07:22

我在我的项目中使用的一些东西是重写子模块pom中的属性。

代码语言:javascript
复制
    root:           <myproject.root>${basedir}</myproject.root>
    moduleA:        <myproject.root>${basedir}/..</myproject.root>
    other/moduleX:  <myproject.root>${basedir}/../..</myproject.root>

这样,您仍然拥有相对路径,但是您可以在根模块中定义一次插件,您的模块将通过正确的myproject.root替换来继承它。

票数 26
EN

Stack Overflow用户

发布于 2013-11-28 19:16:45

有一个maven插件可以解决这个特殊问题:directory-maven-plugin

它会将项目的根路径分配给您选择的属性。请参阅文档中的highest-basedir goal。

例如:

代码语言:javascript
复制
<!-- Directory plugin to find parent root directory absolute path -->
<plugin>
  <groupId>org.commonjava.maven.plugins</groupId>
  <artifactId>directory-maven-plugin</artifactId>
  <version>0.1</version>
  <executions>
    <execution>
      <id>directories</id>
      <goals>
        <goal>highest-basedir</goal>
      </goals>
      <phase>initialize</phase>
      <configuration>
        <property>main.basedir</property>
      </configuration>
    </execution>
  </executions>
</plugin>

然后在父/子pom.xml中的任何位置使用${main.basedir}

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3084629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档