使用插件ClassLoader和项目ClassLoader

时间:2014-08-22 14:45:06

标签: java maven maven-plugin

所以我正在开发一个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,或者我错过了其他的东西。

0 个答案:

没有答案