除了主题中的简单问题之外,还有更多内容。我查看了“类似问题”的建议链接,但没有一个完全有帮助。
背景:为应用程序构建插件系统。其中一部分将需要其他团队自己构建插件。构建的每个插件的结构都有一个带有两个模块的反应器项目,其中一个使用 shade 插件合并到另一个模块中。这会导致在其中一个模块的目标文件夹中创建一个 jar 文件。这一切都很好。因为我们有一些所有插件都需要的东西(设置、结构、依赖项),所以我们构建了另一个项目project-plugin-parent
,其中只有一个 POM,其中包含所有常见的引用和依赖项。然后,每个插件都会为所有常见项目引用这个父 POM,这样开发人员就不必担心它了。传递给 util 的参数之一是 jar 文件。
作为该 POM 的一部分,我们将一些实用程序标记为依赖项,然后将其复制到本地utils
文件夹。下载该实用程序后,我们然后运行它(取决于使用的配置文件)......为了运行它,它需要是可发现的。当我将依赖项和复制命令放入插件(第一个模块)的 POM 中时,效果很好。但我们希望它实际上位于project-plugin-parent
POM 中……这会将 utils 文件夹放在反应器的文件夹中……好吧,我可以使用它。当它尝试运行该实用程序时会出现问题......因为它在父 POM 中,它尝试从那里运行它,因此错误地在参数中传递了错误的 jar 文件。
好的,这就是结构的样子
project-plugin-parent.pom
plugin-project-reactor (with dependency on project-plugin-parent.pom
|
|-- plugin-project-main
|
\-- plugin-second
如果 util 最终出现在 plugin-project-main 中,我更愿意......但如果它最终出现在反应器结构中,那很好。不知何故,我需要能够访问plugin-project-main
. 同时,我不能简单地对文件夹名称进行硬编码,因为它会因项目而异。
在 proect-plugin-parent 中,这里是 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>
这将成功地从 nexus 下载文件并将其复制到反应器级别内的 utils 文件夹中。同样,我更希望它进入主插件文件夹。
这是下载的 jar 的 exec:
<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>
您可以看到我们正在传递插件 jar 的路径,该路径位于 plugin-project-main/target 中......通过上述配置,我得到了对反应器 jar 的引用(它不存在) .
那么有没有办法动态获取reactor中主模块的那个文件夹呢?如果我能做到这一点,那么我可以将 utils 放入模块的文件夹(首选),或者至少在 util 执行时将正确的路径传递给它。