我有一个包含以下模块声明的 Java (11.0.7) Maven (3.0.6) 多模块项目:
<modules>
<module>jdrum-commons</module>
<module>jdrum-datastore-base</module>
<module>jdrum-datastore-simple</module>
<module>jdrum</module>
</modules>
这些 Maven 模块中的每一个都包含一个module-info
定义必要的要求和导出以限制访问和可见性。
因此,jdrum-datastore-simple
有一些我在 的测试中重用的测试实用程序类jdrum
。通过下面的代码片段在 config 中配置 surefire 插件,jdrum
我可以毫无问题地打包整个项目。
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
<!-- Allow the unnamed module access to the tests at test-time -->
--add-opens jdrum/at.rovo.drum.impl=ALL-UNNAMED
--illegal-access=deny
</argLine>
</configuration>
</plugin>
</plugins>
</build>
在父 POM 中,我还通过site
参数配置了报告的生成,该参数还生成了相应项目的 Javadoc。包含 javadoc 的 JAR 的配置以及作为报告一部分的 Javadoc 生成的配置都是相同的,如下所示:
<!-- Generate Javadoc while reporting -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<inherited>true</inherited>
<configuration>
<verbose>true</verbose>
<source>${maven.compiler.source}</source>
<show>protected</show>
<failOnWarnings>false</failOnWarnings>
<release>${maven.compiler.release}</release>
<stylesheet>java</stylesheet>
</configuration>
<reportSets>
<reportSet>
<id>html</id>
<reports>
<report>javadoc</report>
</reports>
</reportSet>
</reportSets>
</plugin>
package
作为生成 as 输出的步骤的一部分的 Javadoc 生成project-version-javadoc.jar
成功,因为jdrum-datastore-simple
依赖关系及其测试仅在测试时包含:
<!-- Test data store to use for testing -->
<dependency>
<groupId>at.rovo</groupId>
<artifactId>jdrum-datastore-simple</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>at.rovo</groupId>
<artifactId>jdrum-datastore-simple</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
如果我将范围从test
to更改为compile
或provided
Javadoc 生成也会失败并出现错误,例如
Exit code: 1 - javadoc: error - The code being documented uses packages in the unnamed module, but the packages defined in https://github.com/RovoMe/JDrum/jdrum-datastore-simple/apidocs/ are in named modules.
据我了解,这里的问题是该jdrum-datastore-simple
模块未添加到Javadoc的模块路径中。因此,下一个合乎逻辑的步骤是将该模块添加到配置中,如下所示:
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<additionalOptions>
<option>--add-modules</option>
<option>jdrum.datastore.simple</option>
</additionalOptions>
</configuration>
</plugin>
</plugins>
</reporting>
这会将jdrum-datastore-simple
模块添加到 Javadoc 配置字符串中,可以在jdrum/target/site/apidocs/options
现在包含
...
--add-modules
jdrum.datastore.simple
...
入口。在进一步分析生成的options
文件时,很明显模块路径缺少对实际 JAR 文件的引用,因此没有生成 Javadoc,因此 Maven 进程由于 Javadoc 无法找到定义的模块而失败。如果我更新该选项文件并将路径添加到丢失的 JAR 文件然后只执行mvn package site
整个过程成功并且一切都很好(因为位于 target/site/apidocs 文件夹中的 javadoc.bat 的纯调用也会如此)。
现在,为了使整个过程更加动态,我想添加或更新模块路径。但是,maven-javadoc-plugin 并不直接允许这样做。因此,我想出了添加一个进一步的 maven-javadoc-plugin 选项--module-path
和一个包含整个路径的进一步选项条目。整个路径是指每个依赖项的路径,所以不仅仅是jdrum-datastore-simple
. 这也有效,但由于对各个 JAR 文件的路径进行了硬编码,因此该项目现在不能被其他用户使用,除非他们具有我使用的相同系统和路径结构。为了解决这个问题,我快速将相应的路径结构替换为${settings.localRepository}
和${project.parent.basedir}
模块路径中各个模块的属性。不幸的是,Javadoc 在它接受的路径结构上相当挑剔,事实证明,在我的 Windows 机器上,Maven 确实返回了一个C:\Users\...
Javadoc 无法处理的路径结构。如果路径结构看起来像C:/Users/...
但是 Javadoc 对值很好。
在进一步的研究中,我偶然发现了这个线程,它建议使用 Mavenbuild-helper-maven-plugin
定义新属性,即 M2 存储库,并使用内置的 reg-ex 功能将\
字符替换为/
. 但是,添加配置,例如
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>replace-local-repo-characters</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>tag.m2repo</name>
<value>${settings.localRepository}</value>
<regex>\\</regex>
<replacement>/</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
<execution>
<id>replace-local-path-characters</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>tag.basedir</name>
<value>${project.parent.basedir}</value>
<regex>\\</regex>
<replacement>/</replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
并且使用引入的标签根本不起作用,因为 Maven 抱怨提供的值无效。如果我使用$\{settings.localRepository}
Maven 对提供的值很好,但是在最终的选项文件中,实际的值不会settings.localRepository
更新,而是提供的字符串本身,我最终会得到类似$/{settings.localRepository}/org/slf4j/...
Javadoc 无法解析的东西,因此仍然错过了jdrum-datastore-simple
依赖项的正确位置。
那么,如何将缺少的依赖项的路径添加到生成的选项文件中定义的 maven-javadoc-plugin 的模块路径中,以便 Maven 实际上能够生成整个报告?