我有一个多模块的maven项目wie quarkus模块和一些定制库,它们是本地maven仓库(所以它们可以被其他maven项目/模块使用)。然而,为了使本地maven仓库可以被其他本地maven项目识别和使用,出于某种原因,你必须手动索引它们。即添加一个像这样的配置quarkus索引到application.properties项目的www.example.com包括本地Maven回购依赖项:
quarkus.index-dependency.<index-name>.group-id = <group-id-of-local-maven-repo>
quarkus.index-dependency.<index-name>.artifact-id = <artifact-id-of-local-maven-repo>
问题是,这给我带来了问题,因为如果你有3层项目依赖关系,比如:
1.项目A(自定义本地maven repo库)
*项目B(自定义本地maven存储库,包括项目A依赖项)
- application.properties(索引项目A库依赖项)
*项目C(最终产品的本地maven项目,包括项目B库依赖项-并通过它间接包括项目A)。 - application.properties *(索引项目B库依赖项和配置,用于数据源或其他与应用相关的内容)
当你生成一个超级jar的时候(fat jar)进行部署,但由于某种原因,它使用了打包jar中项目B的 application.properties,而不是使用正在生成的项目中的 *application.properties(项目C)。因此,应用程序缺少关键配置,无法工作。Maven似乎在这里使用了反向优先级,我不知道这是否是一个错误。当我问到这个问题时,我只是被告知:
“我的依赖项不应具有 application.properties"。
我试图通过 application.properties 找到一种方法来阻止手动索引,并找到了maven jandex插件-它应该会生成索引。下一个问题是,这似乎只在依赖层次结构中的一些项目中起作用,而在其他项目中不起作用,导致了与之前相同的情况,我不明白为什么.这是pom.xml配置插件我已经包括在所有3个项目(整个pom.xml的所有是太长了,所以让我知道如果你需要更多的信息):
<properties>
...
<jandex.skip>false</jandex.skip>
...
</properties>
...
<build>
...
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>3.0.5</version>
<inherited>true</inherited>
<executions>
<execution>
<id>make-index</id>
<goals>
<goal>jandex</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>${jandex.skip}</skip>
</configuration>
</plugin>
...
奇怪的是,这样做的效果很好,我不再需要在Project C application.properties 中索引Project B库依赖项,但Project B库依赖项仍然需要手动索引Project A库依赖项-因此整个操作都是徒劳的。Project C有一个 application.properties 从来都不是问题,而且显然是需要的。项目B现在仍然需要一个属性文件来指向项目A,我该如何解决这个问题?
我在根文件夹中有一个包含所有这些项目的父模块POM,通过它将这个maven jandex依赖项分发给所有模块,因此它看起来像这样:
- Maven父模块(包含所有项目子模块使用的所有依赖项和版本)
1.项目A(自定义本地maven库repo),拥有从父模块继承的pom.xml
*项目B(自定义本地maven库存储库,包括项目A库),拥有从父模块继承的pom.xml
- application.properties -手动索引项目A依赖项,这是一个有问题的依赖项,需要删除!
*项目C(REST API等的本地maven项目,包括项目B库),拥有从父模块继承的pom.xml
pom.xml(父模块POM,包含maven jandex依赖性等)
编辑:其中一个项目,“实体”,存储了所有的数据库访问对象,在mvn clean install
期间没有运行jandex插件,这是该项目的POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.compamny.project</groupId>
<artifactId>entity</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
<version>2.16.1.Final</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
<version>2.16.1.Final</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jackson</artifactId>
<version>2.16.1.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.13.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.smallrye/jandex-maven-plugin -->
<dependency>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>io.smallrye</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>3.0.0</version>
<inherited>true</inherited>
<executions>
<execution>
<id>make-index</id>
<goals>
<goal>jandex</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
当我用mvn io.smallrye:jandex-maven-plugin:3.0.0:jandex
强制执行jandex目标时,它会创建一个META-INF/jandex.jdx文件,但当我运行mvn clean install
时,它不会生成一个文件。这不是一个解决方案,因为我需要构建项目,运行jandex插件并将其单独安装到我的本地存储库中。请注意,我使用的是“io.smallrye”版本的jandex插件,因为“org.jboss”版本似乎根本不起作用。
1条答案
按热度按时间p3rjfoxz1#
我想明白了。jandex插件是在POM配置的
<pluginManagement>
部分设置的,这使得它不能在mvn clean install
上运行。我不得不把它移到plugins
部分,这样它才能被执行。感谢@Ladicek让我看得更仔细,并继续尝试!