Mojo开发:访问javadoc com.sun.tools.javadoc.Main类

时间:2014-10-17 09:16:15

标签: java maven maven-3 maven-plugin

问题:我想从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上。

2 个答案:

答案 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插件。