0

我有以下项目结构:

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)在测试内部调用并检查结果来工作。为此,我需要本地存储库中的工作结构供测试项目依赖。

有没有办法在本地存储库中创建所需的结构?

4

2 回答 2

0

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

于 2019-04-08T11:08:09.420 回答
0

您似乎在以下几个方面误解了Maven(本地)存储库:

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

    <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
    

    *.xml在运行时(测试)期间动态使用 Maven 存储库(本地或远程)中工件的分层(子)结构中的依赖项(或类似资源)没有概念。

    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>
于 2019-04-08T10:32:16.390 回答