0

除了主题中的简单问题之外,还有更多内容。我查看了“类似问题”的建议链接,但没有一个完全有帮助。

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

作为该 POM 的一部分,我们将一些实用程序标记为依赖项,然后将其复制到本地utils文件夹。下载该实用程序后,我们然后运行它(取决于使用的配置文件)......为了运行它,它需要是可发现的。当我将依赖项和复制命令放入插件(第一个模块)的 POM 中时,效果很好。但我们希望它实际上位于project-plugin-parentPOM 中……这会将 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 执行时将正确的路径传递给它。

4

1 回答 1

0

好吧,我找到了问题的答案 - 使用激活。我能够向配置文件添加激活以查找特定目录(仅存在于主模块结构中。)

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

下载到 utils 文件夹的文件现在只执行一次。

它现在导致另一个问题,但这是另一个线程。

于 2020-01-29T14:51:59.917 回答