我使用Maven构建一个库,该库使用代码生成技术生成一些源代码,然后编译源代码(连同一些手写代码),并输出一个JAR供其他项目使用。
然后,当我从应用程序中要求库时,Maven将下载库的POM中指定的所有传递依赖项,包括仅在代码生成过程中使用且运行时不需要的依赖项。
有没有办法告诉Maven,不要将所有依赖项发布为传递依赖项--仅仅是运行时所需的依赖项?
配置细节
库有多个(非测试)源文件夹:
src/main/java -这里住着库公开的自定义代码。src/main/generator --这里住着库没有公开的代码生成器代码。Maven POM文件在主部分中拥有所有应该作为库API的一部分公开的依赖项(“传递依赖项”,作为AFAIU,使用‘编译程序’作用域),另外还有两个概要文件:
generate-code -此配置文件将源代码管理器覆盖到生成器源dir,将输出目录重写到自定义的target/generator-classes目录,并添加生成器代码所需的依赖项。然后在generate-sources阶段运行maven编译器,然后使用其他插件来运行代码生成。build -此概要文件构建从target/generated-sources生成的源(代码生成将它们放在其中)以及主要的target/generated-sources源文件,并输出一个JAR。不幸的是,如果我然后运行mvn deploy,则存储库中生成的版本POM文件包括生成器配置文件中的生成器依赖项,然后消费项目也将下载所有生成器依赖项,并将它们放入类路径中,当您对使用者的JAR进行阴影时,所有的代码生成dep都会被捆绑进来。
发布于 2018-11-08 08:21:27
我最终所做的是只为代码生成器创建另一个POM,并在主POM构建期间使用maven-invoker-plugin运行它。
看起来是这样的:
generate-resources:maven-invoker-plugin run generator-pom.xml generator-pom.xmlgenerate-sources:maven-antrun-plugin为生成器创建一些资源compile:maven-compiler-plugin编译src/generator/javacompile:运行生成器在target/generated-sources中创建源代码
generate-sources:build-helper-maven-plugin添加源target/generated-sourcescompile:maven-compiler-plugin同时编译src/main/java和target/generated-sourcestest ...package ...deploy ...当Maven运行deploy时,它只发布主POM文件,而maven-source-plugin只看到主源目录和生成的源目录,因此它不收集生成器源。
build-helper-maven-plugin的add-source操作很重要,因为代码生成器插件通常会将生成的源目录自动添加到构建的源目录列表中,但是由于它在另一个POM中运行,所以它不能这样做--因此我使用了构建助手来执行该任务。
主POM文件如下所示:
...
<plugins>
<plugin>
<artifactId>maven-invoker-plugin</artifactId>
<configuration>
<pom>generator-pom.xml</pom>
<showErrors>true</showErrors>
<streamLogs>true</streamLogs>
</configuration>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/mystuff</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version> <!-- needed to run JUnit 5 tests -->
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>(发电机POM指的是我公司的很多封闭源,所以不能偷看,对不起)。
https://stackoverflow.com/questions/53156674
复制相似问题