我熟悉 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/