将模块化maven项目jar安装到本地存储库中的父目录中

时间:2019-04-08 08:52:28

标签: java maven maven-install-plugin

我具有以下项目结构:

parent (packing: pom)
    + framework (packing: jar)
    + plugins (packing: pom)
        + plugin_1 (packing: pom)
            + impl (packing: jar)
            + e2e_test (packing: jar)
        + plugin_2 (packing: pom)
            + impl (packing: jar)
            + e2e_test (packing: jar)

plugin_1.implplugin_2.impl内部,有一个resource.xml描述插件。

构建很好,这意味着当我要构建按顺序构建的整个项目时。 但是,安装无法创建相同的结构。 安装后,本地存储库如下所示:

com/company
    + parent/version
        + pom file
    + framework/version
        + jars
    + plugins/version
        + pom file
    + plugin_1/version
        + pom file
    + plugin_1.impl/version
        + jar
    + plugin_1.e2e_tests/version
        + jar
    + plugin_2/version
        + pom file
    + plugin_2.impl/version
        + jar
    + plugin_2.e2e_tests/version
        + jar

但是我想要

com/company/parent/version
    + framework.jar
    + plugins
        + plugin_1.jar
        + plugin_1.xml (renamed resource.xml)
        + plugin_2.jar
        + plugin_2.xml (renamed resource.xml)

是否可以创建所需的结构?

我尝试过maven-install-plugin,例如:

mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
    -Dfile=parent/plugins/plugin_1/impl/resource.xml \
    -DgroupId=com.company \
    -DartifactId=parent \
    -Dversion=1.0-SNAPSHOT \
    -Dpackaging=file \
    -DgeneratePom=true

或与此等价的pom.xml(但用于广口瓶):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>3.0.0-M1</version>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.parent.parent.artifactId}</artifactId>
                <version>${project.version}</version>
                <packaging>jar</packaging>
                <file>${project.build.directory}/${project.build.finalName}.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

但这总是会根据artifactId重命名文件,而我最终会覆盖同一文件。

我能够通过在最高父级目标目录中使用copy-rename-maven-plugin来创建所描述的结构。

我想要这种结构,因为:

  1. framework可以使用放在jar目录中的带有适当描述符的任何plugins
  2. 我不想在每次重新编译或更改多个插件中的内容时手动进行此操作。
  3. 模块的端到端测试通过在测试内部调用framework plugin_1 (args)并检查结果来工作。为此,我需要本地存储库中的工作结构以供测试项目依赖。

是否可以在本地存储库中创建所需的结构?

2 个答案:

答案 0 :(得分:0)

您似乎在某些方面误解了Maven (local) repositories

  1. 本地存储库是用于在远程存储库中存储工件的缓存(尽管如果不必与他人共享,则不必将后者用于由您创建的工件)。
  2. 存储库用于在构建时而不是在运行时中解决依赖关系。
  3. 存储库中的完整路径标识具有特定版本的特定工件(JAR,WAR,EAR或POM),因为其路径来自具有标识三元组的Maven Coordinates GAV(groupIdartifactIdversion)。其中:

    <groupId>com.my.company</groupId>
    <artifactId>my-artifact</artifactId>
    <version>1.0.0</version>
    

    成为目录结构:

    ~/.m2/repositories
      + com
        + my
          + company
            + my-artifact
              + 1.0.0
                + my-artifact-1.0.0.jar  [or war, ear, ...]
                + my-artifact-1.0.0.pom
    

    在Maven存储库(本地或远程)的工件的层次结构(子)结构中,没有依赖关系(或资源,*.xml之类的东西)可以在运行时(测试)期间动态使用。

    这就是为什么您在构建后会看到同一级别com/company(包括install)上的所有工件。它们都是平等的。就Maven而言,没有一个比另一个更可取了。

更新

可能的解决方案:

framework和相应的插件实现添加为测试项目的依赖项,并相应地在测试代码中使用它们:

plugin_1.e2e_tests

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>framework</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>plugin_1.impl</artifactId>
    <version>...</version>
</dependency>

plugin_2.e2e_tests

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>framework</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>plugin_2.impl</artifactId>
    <version>...</version>
</dependency>

答案 1 :(得分:0)

Maven本地存储库具有固定的目录结构。此结构不应更改。它反映了Maven坐标(groupId,artifactId,版本)。