java - 将类传递给 Maven2 插件

标签 java class plugins maven-2 mapping

我熟悉 Maven 插件开发,我需要帮助解决一个问题。

据我了解,将复杂对象传递给 Maven 插件非常容易,但是传递类怎么样? 假设我正在编写自己的插件,其中仅包含 2 个类。

消息.java

package abstractmessage;
public abstract class Message {
    public abstract String getMessage();
}

MessageMojo.java

/**
 * @goal message
 */
public class MessageMojo extends AbstractMojo {
    /**
     * @parameter expression="${message.messageClass}"
     */
    private String messageClass ;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Message message = null;

        try {
            Class<?> clazz = Class.forName(messageClass);
            message = (Message) clazz.newInstance();
        } catch (Exception e) {
            getLog().error(e);
        }

        getLog().info(message.getMessage());
    }
}

因此插件需要扩展消息类的名称并尝试动态初始化它。

真实 Maven 项目中的扩展 Message 类如下所示。

package message;
import abstractmessage.Message;

public class RealMessage extends Message {
    @Override
    public String getMessage() {
        return "Hello plugin. From MavenProject.";
    }
}

并且 pom.xml 使用该插件。

<build>
    <plugins>
        <plugin>
            <artifactId>message-plugin</artifactId>
            <groupId>message-plugin</groupId>
            <version>1.0</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <goals>
                        <goal>message</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <messageClass>message.RealMessage</messageClass>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <artifactId>message-plugin</artifactId>
        <groupId>message-plugin</groupId>
        <version>1.0</version>
    </dependency>
</dependencies>

但是当我执行 maven:test 时,我得到一个 java.lang.ClassNotFoundException: message.RealMessage

为什么会这样?

最佳答案

您的插件的类加载器无权访问项目的类。它只能访问自己的类及其依赖项。

你有两个选择。

选项一是创建一个新的类加载器,从当前项目及其依赖项加载类。 surefire plugin是执行此操作的插件的示例 - 它可以加载已编译的单元测试类并在未处于 fork 模式时运行它们。

从依赖项创建一个新的类加载器并不完全是微不足道的,但首先您需要在 Mojo 上放置 @requiresDependencyResolution test ,并获取项目的依赖项(以及构建)项目的输出目录(如果要在搜索中包含项目的类)并从这些 JAR 和目录构造 URLClassLoader。 Surefire的generateTestClasspath() method可能会有所帮助作为起点。

另一个选择是在单独的项目中编译 RealMessage 类,构建一个单独的 JAR 并将其作为消息插件的依赖项包含在内。

在这种情况下,您的构建部分将类似于:

<build>
    <plugins>
        <plugin>
            <artifactId>message-plugin</artifactId>
            <groupId>message-plugin</groupId>
            <version>1.0</version>
            <executions>
                <execution>
                    <phase>test</phase>
                    <goals>
                        <goal>message</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <messageClass>message.RealMessage</messageClass>
            </configuration>
            <dependencies>
                <groupId>message-plugin-additions</groupId>
                <artifactId>message-plugin-additions</artifactId>
                <version>1.0</version>
            </dependencies>
        </plugin>
    </plugins>
</build>

其中 message-plugin-additions 项目包含 message.RealMessage 类。如果您愿意使用单独的项目,这可能会比第一个选项简单得多。

关于java - 将类传递给 Maven2 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724431/

相关文章:

java - 跨 Eclipse 插件共享域对象的最佳方式?

Wordpress 联系表 7 datepicker 更改日期格式

java - 正则表达式仅在字符串之后匹配重复模式

.net - 类和文件 VB .Net

class - Racket 类中的私有(private)字段(或成员变量)

C# - 从 .NET DLL(类库)执行代码而不引用它?

java - 学习复杂软件包的策略

java - Soapui - 警告 - 未检测到文档的语法约束(DTD 或 XML 模式)

java - H2 内存 DB : Set Timezone with JDBC? Java 单元测试

plugins - 模块 "taggableComplete"未启用