java Maven jandex插件不会为本地自定义Maven存储库生成索引(有时)

46scxncf  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(227)

我有一个多模块的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”版本似乎根本不起作用。

p3rjfoxz

p3rjfoxz1#

我想明白了。jandex插件是在POM配置的<pluginManagement>部分设置的,这使得它不能在mvn clean install上运行。我不得不把它移到plugins部分,这样它才能被执行。感谢@Ladicek让我看得更仔细,并继续尝试!

相关问题