所以我正在开发一个maven插件,我需要修改类加载器才能正常工作。问题是我不确定我是否正在修改正确的类加载器。我正在做的是以下内容:
@Mojo(name = "aggregate", requiresDependencyResolution = ResolutionScope.TEST)
public class AcceptanceTestMojo extends AbstractMojo {
private static final String SYSTEM_CLASSLOADER_FIELD_NAME = "scl";
@Parameter
private String property;
@Component
public PluginDescriptor pluginDescriptor;
@Component
public MavenProject mavenProject;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
ClassLoader newClassLoader = null;
List<String> runtimeClassPathElements;
try {
runtimeClassPathElements = mavenProject.getTestClasspathElements();
} catch (DependencyResolutionRequiredException e) {
throw new MojoFailureException(MojoFailureMessages.UNRESOLVED_DEPENDENCIES_MESSAGE);
}
ClassRealm realm = pluginDescriptor.getClassRealm();
ClassRealm modifiedRealm= new ClassRealm( realm.getWorld(), realm.getId(), realm.getParentClassLoader());
try {
for (String element : runtimeClassPathElements) {
File elementFile = new File(element);
modifiedRealm.addURL(elementFile.toURI().toURL());
}
} catch (MalformedURLException e) {
throw new MojoFailureException(MojoFailureMessages.UNRESOLVED_CLASSES_MESSAGE);
}
pluginDescriptor.setClassRealm(modifiedRealm);
所以我得到了ClassRealm,我正在对UCP进行细微的更改(删除一些jar),之后我将新创建的ClassRealm设置为项目描述符。我也在更改ContextClassLoader和SystemClassLoader,因为我正在执行我的插件的项目正在使用它们进行一些交互。这两个工作正常 - 它们被更改,插件可以正常工作。问题是插件类加载器。因为出于某种原因,在一个项目上执行我的插件时,它会查看插件ClassRealm并从那里搜索所需的jar。但是我上面提到的代码并不完全正确,因为当我来到插件的执行部分看插件ClassRealm时,它不是修改过的 - 它得到了另一个引用,我不知道它在哪里来自。我认为我没有正确设置ClassRealm,或者我错过了其他的东西。