问题:我想从Mojo插件中的代码访问com.sun.tools.javadoc.Main。
我对这个问题有两个部分。
第1部分:
创建mojo插件时,最好在@Mojo中使用注释或参数 例如,您可以在两者中设置'requiresDependencyResolution'。
/*
* @goal install
* @phase process-classes
* @configurator include-project-dependencies
* @requiresDependencyResolution compile+runtime
*/
@Mojo(name = "document", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class CreatorMavenPlugin extends AbstractMojo
第2部分:(主要问题)
我想在我的插件中执行以下代码,我想挂钩到Javadoc代。
com.sun.tools.javadoc.Main.execute(new String[]
{
"-private",
"-doclet",
"com.test.tools.APIDocGenDoclet",
javaFilePathAndName
});
return APIDocGenDoclet.getCurrentClassDocs();
问题是eclipse识别它所拥有的JDK中的com.sun.tools.javadoc.Main。
Maven运行时无法找到类并给出错误....
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[maven.api, parent: null]]
-----------------------------------------------------
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:125)
... 20 more
Caused by: java.lang.NoClassDefFoundError: com/sun/tools/javadoc/Main
我尝试直接添加工具以作为依赖开始...
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
但这不起作用。 (同样的错误)
我尝试将其添加为我的插件在...下运行的配置文件的依赖项。
<profile>
<id>auto-doc</id>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.test</groupId>
<artifactId>updater</artifactId>
<version>1.0.0-SNAPSHOT</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>document</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
但不是改变,同样的错误。
我觉得这与为Mojo插件定义的类路径设置有关,但我尝试了很多不同的组合,但我很难过。
有人可以帮忙吗? 注意:我正在使用Maven 3.0.4&amp; JDK 1.6.0_43 32位在Windows上。
答案 0 :(得分:0)
第1部分:如果您不需要与古代Maven版本向后兼容,请使用注释。它是指定Mojo配置的新的更好的方式,您的IDE将为您提供自动完成和悬停。
第2部分:
看一下existing Maven Javadoc plugin does:
它似乎使用Toolchain API来定位运行的相应Javadoc工具。 Maven编译器插件也是为了获得javac。
总结工具链文档:
添加
@Component
private ToolchainManager toolchainManager;
@Component
private MavenSession session;
到你的Mojo。然后在你的代码中
Toolchain tc = toolchainManager.getToolchainFromBuildContext( "jdk", session );
String javadocExecutable = tc.findTool( "javadoc" );
然后你可以执行它。请阅读链接中的工具链文档以获取更多详细信息。
如果您使用的是Java 8或更高版本,则可以使用ToolProvider.getSystemDocumentationTool()。
答案 1 :(得分:0)
我将Profile部分放在正在构建的项目中,而不是放在包含Mojo插件的项目中。
这是我在Mojo插件项目中获得的
<profiles>
<profile>
<id>default-tools.jar</id>
<activation>
<property>
<name>java.vendor</name>
<value>Sun Microsystems Inc.</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.6.0</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
</profiles>
Mojo插件定义为......
/**
* @goal install
* @phase process-classes
* @configurator include-project-dependencies
* @requiresDependencyResolution compile+runtime
*/
@Mojo(name = "document", requiresDependencyResolution= ResolutionScope.COMPILE_PLUS_RUNTIME)
public class DocumationUpdatorMavenPlugin extends AbstractMojo
我使用该插件的项目在POM中有这个......
<profile>
<id>auto-doc</id>
<build>
<plugins>
<plugin>
<groupId>com.test</groupId>
<artifactId>updater</artifactId>
<version>1.0.0-SNAPSHOT</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>document</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
然后我的命令&#34; mvn install -Pauto-doc&#34;开始我的AutoDoc插件。