我正在使用Maven构建一个库,该库使用代码生成技术生成一些源代码,然后编译该源代码(以及一些手写代码),并输出JAR供其他项目使用。
然后,当我从应用程序中请求该库时,Maven将下载该库的POM中指定的所有传递性依赖项,包括仅在代码生成过程中使用且运行时不需要的依赖项。
是否有一种方法可以告诉Maven不要将所有依赖项都发布为可传递依赖项-只是运行时所需的依赖项?
该库具有多个(非测试)源文件夹:
src/main/java
-这是库公开的自定义代码。src/main/generator
-这是库未公开的代码生成器代码。在主部分中,Maven POM文件具有所有应作为库API的一部分公开的依赖项(“传递性依赖项”,使用AFAIU,使用“ compile”作用域),此外还有两个个人资料:
generate-code
-此配置文件将源导向器覆盖到生成器源目录,将输出目录覆盖到自定义target/generator-classes
目录,并且还添加生成器代码所需的依赖项。然后,它在generate-sources
阶段运行maven编译器,然后使用其他插件来运行代码生成。build
-此配置文件从target/generated-sources
(由代码生成将它们放置在其中)生成生成的源以及主要Java源文件,并输出JAR。不幸的是,如果我随后运行mvn deploy
,则存储库中生成的版本化POM文件将包括整个内容,包括生成器概要文件中的生成器依赖项,然后使用项目也将下载所有生成器依赖项,它们放在类路径中,并在遮盖使用者的JAR时,将所有代码生成部门捆绑在一起。
答案 0 :(得分:0)
我最终要做的是为代码生成器创建另一个POM,并在主POM构建期间使用maven-invoker-plugin
来运行它。
所以看起来像这样:
generate-resources
:maven-invoker-plugin
运行generator-pom.xml
generator-pom.xml
:generate-sources
:maven-antrun-plugin
为生成器创建一些资源compile
:maven-compiler-plugin
编译src/generator/java
compile
:运行generator在target/generated-sources
中创建源generate-sources
:build-helper-maven-plugin
添加源target/generated-sources
compile
:maven-compiler-plugin
同时编译src/main/java
和target/generated-sources
test
... package
... deploy
... 当Maven运行deploy
时,它仅发布主POM文件,而maven-source-plugin
仅看到主源目录和生成的源目录,因此它不收集生成器源。
build-helper-maven-plugin
的{{1}}操作很重要,因为代码生成器插件通常会自动将生成的源目录添加到构建的源目录列表中,但是由于它在另一个POM中运行,因此可以不这样做-所以我改用build-helper来执行该任务。
主要的POM文件如下:
add-source
(生成器POM指的是我公司很多封闭源代码的东西,抱歉,所以不要偷看。)