gpt4 book ai didi

maven - maven 如何决定何时使用目标文件夹作为类路径

转载 作者:行者123 更新时间:2023-12-05 00:12:42 26 4
gpt4 key购买 nike

我有一个关于 maven 在构建过程中如何计算类路径的问题。具体来说,控制何时使用“目标/类”以及何时使用来自存储库(本地/远程)的“jar”。

我有一个版本为 1.0.0-SNAPSHOT 的项目,其中尚未安装/部署 Artifact ,因此某些存储库(远程或本地)中没有“jar”来解决它们。我想运行“生成源”而不在本地安装(不运行“mvn install”)。

结构如下所示:

parent-prj
parent-prj/sub-prj
parent-prj/gen-src-prj <--- This depends on 'sub-prj'

当我运行“ mvn -am -pl parent-prj/gen-src-prj generate-sources”以生成一些 java 文件时,它不起作用:
[ERROR] Failed to execute goal on project gen-src-prj: Could
not resolve dependencies for project
mygrp:gen-src-prj:jar:1.0.0-SNAPSHOT:
Could not find artifact
mygrp:sub-prj:jar:1.0.0-SNAPSHOT -> [Help 1]

使用调试输出并添加“dependency:build-classpath”,我可以确认 maven 忽略了 react 器中“sub-prj”的存在,并在找不到的地方寻找“jar”。然而,该项目打印在 react 器摘要中:
[INFO] Reactor Summary:
[INFO]
[INFO] parent-prj ..................................... SUCCESS [ 0.625 s]
[INFO] sub-prj ........................................ SUCCESS [ 0.018 s]
[INFO] gen-src-prj .................................... FAILURE [ 0.040 s]

我注意到有趣的事情是运行编译目标工作正常!这使用 sub-prj/target/classes (如dependency:build-classpath所示)并且生成源代码甚至编译它们都没有问题:“ mvn -am -pl parent-prj/gen-src-prj compile

所以这里是我想了解的几点:
  • 为什么 compile 目标有效但 generate-sources 无效?
  • maven 什么时候决定在 react 器类路径上使用以前项目的输出文件夹而不是寻找 jar?
  • 有没有办法让 generate-sources 直接运行,即使没有解决它的依赖关系?

  • 关于(3)我的生成工具是一个由以下调用的实用程序:
        <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
    <execution>
    <phase>generate-sources</phase>
    <goals>
    <goal>java</goal>
    </goals>
    </execution>
    </executions>

    该工具读取 src/main/resources 中的一些 XML 并生成 Java 文件,并且在其类路径中不需要任何东西(因此不需要 maven 来解决它)。

    另请注意,即使提供了 (3) 的解决方案,我也有兴趣了解 (1) 和 (2)。

    编辑:根据评论请求,添加完整示例

    父项目/pom.xml
    <?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>mygrp</groupId>
    <artifactId>parent-prj</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
    <module>sub-prj</module>
    <module>gen-src-prj</module>
    </modules>

    <build>
    <pluginManagement>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
    <source>1.8</source>
    <target>1.9</target>
    <encoding>UTF-8</encoding>
    </configuration>
    </plugin>
    </plugins>
    </pluginManagement>
    </build>
    </project>

    父项目/子项目/pom.xml
    <?xml version="1.0"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>

    <parent>
    <groupId>mygrp</groupId>
    <artifactId>parent-prj</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>sub-prj</artifactId>
    </project>

    父-prj/gen-src-prj/pom.xml
    <?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>

    <parent>
    <groupId>mygrp</groupId>
    <artifactId>parent-prj</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    </parent>

    <artifactId>gen-src-prj</artifactId>

    <dependencies>
    <dependency>
    <groupId>mygrp</groupId>
    <artifactId>sub-prj</artifactId>
    <version>${project.version}</version>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
    <execution>
    <phase>generate-sources</phase>
    <goals>
    <goal>java</goal>
    </goals>
    </execution>
    </executions>
    <configuration>
    <includeProjectDependencies>false</includeProjectDependencies>
    <includePluginDependencies>true</includePluginDependencies>
    <mainClass>uk.co.real_logic.sbe.SbeTool</mainClass>
    <systemProperties>
    <systemProperty>
    <key>sbe.output.dir</key>
    <value>${project.build.directory}/generated-sources/java</value>
    </systemProperty>
    <systemProperty>
    <key>sbe.validation.warnings.fatal</key>
    <value>true</value>
    </systemProperty>
    </systemProperties>
    <arguments>
    <argument>${project.build.resources[0].directory}/Examples.xml</argument>
    </arguments>
    <workingDirectory>${project.build.directory}/generated-sources/java</workingDirectory>
    </configuration>
    <dependencies>
    <dependency>
    <groupId>uk.co.real-logic</groupId>
    <artifactId>sbe-tool</artifactId>
    <version>1.7.10</version>
    </dependency>
    </dependencies>
    </plugin>

    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
    <execution>
    <id>add-source</id>
    <phase>generate-sources</phase>
    <goals>
    <goal>add-source</goal>
    </goals>
    <configuration>
    <sources>
    <source>target/generated-sources/java/</source>
    </sources>
    </configuration>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>

    编辑:根据答案中的知识,我想出了这种解决方法,可以让人们实现所需的行为。我在默认情况下处于事件状态的配置文件中列出了依赖项,然后使用另一个配置文件运行没有激活依赖项的 generate-sources,如下所示:

    父-prj/gen-src-prj/pom.xml
    <profiles>
    <profile>
    <id>default</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    </activation>
    <dependencies>
    <dependency>
    <groupId>mygrp</groupId>
    <artifactId>sub-prj</artifactId>
    <version>${project.version}</version>
    </dependency>
    </dependencies>
    </profile>

    <profile>
    <id>excludeDependency</id>
    <dependencies>
    </dependencies>
    </profile>
    </profiles>

    要使用上述生成源,请使用: mvn -PexcludeDependency generate-sources

    最佳答案

    Maven 只能引用当前 session 中生成的输出(在当前执行的 shell 命令期间)。它使用最“成熟”的地方来寻找“输出”:

  • 如果 compile正在运行 - 类(class)结束于 target/classes dir,因此其他模块可以引用
  • 如果 package运行 - 然后 target/*.jar被创建并且这个 jar 文件最终在类路径中而不是
  • 如果 install运行 - 然后 jar 文件在本地存储库中结束 - 这是在类路径
  • 上结束的内容

    因此,有 3 个因素会阻碍您的任务:
  • maven-exec-plugin 需要依赖解析(@mondaka 指出)
  • 您的模块 1 引用了模块 2
  • generate-sources在编译之前运行。因此 module2 还没有准备好用作依赖项。

  • 因此,如果您想按照自己的方式进行操作 - 您必须至少运行 compile每次使用默认生命周期中的任何内容时的阶段。或者您可以编写自己的不需要依赖解析的插件。

    关于maven - maven 如何决定何时使用目标文件夹作为类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288587/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com