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

我有一个版本为1.0.0-SNAPSHOT的项目,该项目尚未安装/部署,因此某些存储库(远程或本地)中没有“jar”来解决它们。我想运行“generate-sources”而不在本地安装(不运行“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

所以这是我想了解的要点:
  • 为什么编译目标有效,但是generate-sources不起作用?
  • maven决定在什么时候使用 react 堆类路径上先前项目的输出文件夹而不是寻找jar?
  • 是否有一种方法可以直接运行我想要的生成源,即使没有解决依赖关系也是如此?

  • 关于(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)。

    编辑:每个评论请求,添加完整的示例

    parent-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>
    
        <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>
    

    parent-prj/sub-prj/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错误有关:

    https://issues.apache.org/jira/browse/MNG-3283

    问题说:“仅当插件将自身绑定(bind)到
    generate-sources阶段,并具有@requiresDependencyResolution”。

    我检查了exec-maven-plugin Mojo确实有requiresDependencyResolution = ResolutionScope.TEST。您可以在https://github.com/mojohaus/exec-maven-plugin/blob/master/src/main/java/org/codehaus/mojo/exec/ExecJavaMojo.java上看到它

    然后,您唯一的选择是使用编译或过程类阶段。这是2007年以来的一个主要开放错误。

    10-02 22:16