如何强制使用javadoc jar,即使没有(公共)Javadoc?



我有一个Maven多模块项目,其中一些子模块仅供内部使用。我不希望为它发布任何可见的Javadoc,因为它不应该被第三方直接使用。其中没有一个公共包(包名本身类似于a.b.c.internal.d(。

但是,要将 jar 发布到 Maven Central,OSS Sonatype 要求所有库 jar 都有随附的源代码和 javadoc jar。

如何强制使用固定索引创建 javadoc jar,以告知子模块的用途?我想到了包信息.java,但我没有公共包(所有带有"内部"一词的包都被忽略(。

我发现的一个非常丑陋的解决方法(我不会接受这个答案(是简单地触发错误并将错误时失败设置为 false。然后javadoc-plugin继续处理一个空的target/apidocs文件夹,并生成一个空的子模块javadoc.jar。

触发我发现的错误的最简单和最简单的方法是在/src 根文件夹中创建一个空的包信息.java。这将生成以下生成输出:

[INFO] --- maven-javadoc-plugin:3.1.1:jar (attach-javadocs( @ 我的内部模块--- [信息] 1 错误 [错误] MavenReport异常: 生成 Javadoc 时出错:退出代码:1 - javadoc:错误 - 否 找到要记录的公共或受保护类。

命令行是:"C:\Program 文件\Java\jdk1.8.0_131\jre..\bin\javadoc.exe" @options @argfile

参考 中生成的 Javadoc 文件 'D:\工作站\我的父项目\模块\我的内部模块\目标\apidocs' 迪尔。

org.apache.maven.reporting.MavenReport异常:退出代码:1 - javadoc:error - 找不到要记录的公共或受保护类。

命令行是:"C:\Program 文件\Java\jdk1.8.0_131\jre..\bin\javadoc.exe" @options @argfile

参考 中生成的 Javadoc 文件 'D:\工作站\我的父项目\模块\我的内部模块\目标\apidocs' 迪尔。

at org.apache.maven.plugins.javadoc.AbstractJavadocMojo.executeJavadocCommandLine(AbstractJavadocMojo.java:5763)
at org.apache.maven.plugins.javadoc.AbstractJavadocMojo.executeReport(AbstractJavadocMojo.java:2152)
at org.apache.maven.plugins.javadoc.JavadocJar.doExecute(JavadocJar.java:189)
at org.apache.maven.plugins.javadoc.AbstractJavadocMojo.execute(AbstractJavadocMojo.java:1911)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

[信息] 建筑罐: D:\workstation\my-parent-project\modules\my-internal-module\target\my-internal-module-6.0.0.beta-SNAPSHOT.2-javadoc.jar

使用以下插件配置:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<phase>package</phase>
<configuration>
<show>public</show>
<failOnError>false</failOnError>
<detectOfflineLinks>false</detectOfflineLinks>
<doclint>all,-missing</doclint>
<nohelp>true</nohelp>
<excludePackageNames>*.internal.*,testutil,demo</excludePackageNames>
<quiet>true</quiet>
</configuration>
</execution>
</executions>
<configuration>
<failOnError>false</failOnError>
</configuration>
</plugin>

虽然这满足了我的主要需求(以一种非常丑陋的方式(,但我更喜欢一个带有一个主要自定义条目的 javadoc,我在其中解释了模块的目的。

不要使用Javadoc 工具来生成包含非标准内容的 jar:使用maven-jar-plugin手动创建一个。

取自 https://vzurczak.wordpress.com/2014/08/01/generate-an-empty-javadoc-jar-file/的初始解决方案

这是我确定的最终解决方案,当在父 pom 中配置时,它通常适用于所有子模块:

定义两个配置文件:

一个用于执行标准Javadoc插件,如果
  • 子模块中不存在自定义Javadoc文件夹(缺少src/main/javadoc(
  • 一个通过 jar 插件执行自定义 Javadoc 如果子模块中存在自定义 Javadoc 文件夹(存在 SRC/main/javadoc(

Maven 配置:

<profiles>
<profile>
<id>standard-javadoc</id>
<activation>
<file><missing>src/main/javadoc</missing></file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<phase>package</phase>
<configuration>
<show>public</show>
<failOnError>false</failOnError>
<detectOfflineLinks>false</detectOfflineLinks>
<doclint>all,-missing</doclint>
<nohelp>true</nohelp>
<excludePackageNames>*.internal.*,testutil,demo</excludePackageNames>
<quiet>true</quiet>
</configuration>
</execution>
</executions>
<configuration>
<failOnError>false</failOnError>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>custom-javadoc</id>
<activation>
<file><exists>src/main/javadoc</exists></file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>javadoc</classifier>
<classesDirectory>${project.basedir}/src/main/javadoc</classesDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

最新更新