Java 如何使用Maven复制文件并将第一个模块指定为目标文件夹?

Java 如何使用Maven复制文件并将第一个模块指定为目标文件夹?,java,maven,maven-reactor,Java,Maven,Maven Reactor,更重要的是,这个问题很简单。我已经看过了“类似问题”的建议链接,但没有一个是完全有用的 背景: 为应用程序构建插件系统。其中一部分需要其他团队自己构建插件。构建的每个插件的结构都有一个包含两个模块的reactor项目,其中一个模块使用shade插件合并到另一个模块中。这将导致在其中一个模块的目标文件夹中创建一个jar文件。这一切都很好。因为我们有一些所有插件都需要的东西(设置、结构、依赖项),所以我们构建了另一个项目projectpluginparent,其中只有一个POM包含所有公共引用和依赖

更重要的是,这个问题很简单。我已经看过了“类似问题”的建议链接,但没有一个是完全有用的

背景: 为应用程序构建插件系统。其中一部分需要其他团队自己构建插件。构建的每个插件的结构都有一个包含两个模块的reactor项目,其中一个模块使用shade插件合并到另一个模块中。这将导致在其中一个模块的目标文件夹中创建一个jar文件。这一切都很好。因为我们有一些所有插件都需要的东西(设置、结构、依赖项),所以我们构建了另一个项目
projectpluginparent
,其中只有一个POM包含所有公共引用和依赖项。然后,每个插件都会为所有公共项引用此父POM,这样开发人员就不必担心它了。传递给util的参数之一是jar文件

作为POM的一部分,我们将一些实用程序标记为依赖项,然后将它们复制到本地
utils
文件夹。下载该实用程序后,我们将运行它(取决于使用的配置文件)。。。为了运行它,它需要是可发现的。当我将依赖项和copy命令放入插件(第一个模块)的POM中时,效果非常好。但我们希望它实际位于
项目插件父级
POM。。。这会将utils文件夹放在反应堆的文件夹中。。。好的,我可以用这个。问题发生在它尝试运行实用程序时。。。因为它在父POM中,所以它试图从那里运行它,因此在参数中错误地传递了错误的jar文件

好的,这是结构的样子

project-plugin-parent.pom

plugin-project-reactor (with dependency on project-plugin-parent.pom
|
|-- plugin-project-main
|
\-- plugin-second 
我更喜欢如果util最终出现在插件项目main中。。。但如果它最终进入反应堆结构,那没关系。不知何故,我需要能够访问
插件项目main
的文件夹/jar。同时,我不能简单地硬编码文件夹名称,因为它会因项目而异

在proect插件父级中,这里是maven copy命令的配置节点

<configuration>
  <artifactItems>
      <artifactItem>
          <groupId>gov.va.bip.docgen</groupId>
          <artifactId>my-project-svc-rest</artifactId>
          <version>1.0.0</version>
          <type>jar</type>
          <destFileName>my-service.jar</destFileName>
      </artifactItem>
  </artifactItems>
  <outputDirectory>${project.build.directory}/../utils</outputDirectory>
</configuration>

gov.va.bip.docgen
我的项目svc rest
1.0.0
罐子
my-service.jar
${project.build.directory}/./utils
这将成功地从nexus下载文件,并将其复制到反应堆级别内的utils文件夹中。同样,我更希望它进入主插件文件夹

下面是下载的jar的执行者:

                        <configuration>
                            <executable>java</executable>
                            <arguments>
                                <argument>-Dloader.path=${project.build.directory}/${project.build.finalName}/${artifactId}.jar</argument>
                                <argument>-Dserver.port=10080</argument>
                                <argument>-jar</argument>
                                <argument>${project.build.directory}/../utils/my-service.jar</argument>
                            </arguments>
                            <includeProjectDependencies>false</includeProjectDependencies>
                        </configuration>

JAVA
-Dloader.path=${project.build.directory}/${project.build.finalName}/${artifactId}.jar
-数据服务器端口=10080
-罐子
${project.build.directory}/./utils/my-service.jar
假的
您可以看到,我们正在传递插件的jar路径,它位于插件项目main/target中。。。在上面的配置中,我得到了一个对反应器jar的引用(它不存在)


那么,有没有办法动态获取反应堆中主模块的文件夹?如果我能得到,那么我可以将util放入模块的文件夹(首选),或者至少在执行util时将正确的路径传递给util。

我找到了问题的答案-使用激活。我能够向概要文件中添加一个激活,以查找特定的目录(它将只存在于主模块结构中)


假的
目标/类/内容根
下载到utils文件夹的文件现在只执行一次

这会导致另一个问题,但这是另一个线程的问题

<activation>
  <activeByDefault>false</activeByDefault>
  <file>
    <exists>
      target/classes/content-root
    </exists>
  </file>
</activation>