1

我有一个包含以下模块声明的 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>

如果我将范围从testto更改为compileprovidedJavadoc 生成也会失败并出现错误,例如

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 实际上能够生成整个报告?

4

1 回答 1

0

似乎使用java11 Update 9(也许还有更新 8;未测试)maven-javadoc-plugin 能够为多模块项目正确生成 Javadoc,而无需更改模块路径。

对于那些对实际 Maven POM 的样子感兴趣的人:

于 2020-12-22T07:43:16.417 回答