【问题标题】:How to add maven build output to plugin classloader?如何将 Maven 构建输出添加到插件类加载器?
【发布时间】:2016-05-17 01:42:34
【问题描述】:

我在 maven-antrun-plugin 中运行 AntTask 时遇到问题。不幸的是,AntTask 使用插件类加载器从项目中定位文件,但是从插件中运行时,构建输出不包含在插件的类路径中。

来自Guide to Maven Classloading

请注意插件类加载器不包含 当前项目的依赖关系及其构建输出。

...

插件可以自行决定创建更多的类加载器。 例如,一个插件可能想要创建一个类加载器,它结合 插件类路径和项目类路径。

谁能指出我正确的方向如何创建我自己的 maven-antrun-plugin 版本,我可以在其中创建自己的类加载器,它结合了插件类路径和项目类路径?我需要更新类加载器,以便当我的自定义 antrun-plugin 调用执行的类时:

getClass().getClassLoader().getResource()

类加载器也会搜索构建输出文件夹。

【问题讨论】:

  • 你想做什么?为什么要使用 maven-antrun-plugin?
  • @khmarbaise 我正在尝试将遗留的 ant 项目转换为 maven。不幸的是,ant build 的一部分使用了一个已失效的 Kodo Ant 任务来增强我没有找到 maven 等效的实体的 JDO。所以我只是想通过 maven-Antrim-plugin 调用 ant 任务。但正如我所解释的,该任务使用类加载器在类路径中定位属性文件。但是由于插件类加载器不包含构建源/输出,因此找不到它并且任务失败。修改 ant 任务并不是一个真正的选择,所以我想修改插件加载器的类路径。

标签: java maven plugins classloader maven-plugin


【解决方案1】:

在尝试通过配置解决这个问题几个小时后,我硬着头皮写了自己的插件来扩展 AntRun 插件。这是使用 Maven 3.2.5 完成的:

@Mojo( name = "run", threadSafe = true, requiresDependencyResolution = ResolutionScope.TEST )
public class CustomAntMojo
    extends AntRunMojo
{

    @Component
    private PluginDescriptor pluginDescriptor;

    public void execute()
        throws MojoExecutionException
    {
        File buildDirectory = new File( getMavenProject().getBuild().getOutputDirectory() );

        // add the build directory to the classpath for the classloader
        try {
            ClassRealm realm = pluginDescriptor.getClassRealm();
            realm.addURL(buildDirectory.toURI().toURL());
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        // configure the log4j logger to output the ant logs to the maven log
        BasicConfigurator.configure( new MavenLoggerLog4jBridge(getLog()));
        super.execute();

    }
}

使用 MavenLoggerLog4jBridge 类将我的 Ant 任务的 Log4j 输出转换为 maven 记录器 (https://stackoverflow.com/a/6948208/827480):

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.maven.plugin.logging.Log;
public class MavenLoggerLog4jBridge extends AppenderSkeleton {
    private Log logger;

    public MavenLoggerLog4jBridge(Log logger) {
        this.logger = logger;
    }

    protected void append(LoggingEvent event) {
        int level = event.getLevel().toInt();
        String msg = event.getMessage().toString();
        if (level <= Level.DEBUG_INT ) {
            this.logger.debug(msg);
        } else if (level == Level.INFO_INT) {
            this.logger.info(msg);
        } else if (level == Level.WARN_INT) {
            this.logger.warn(msg);
        } else if (level == Level.ERROR_INT || level == Level.FATAL_INT) {
            this.logger.error(msg);
        }
    }

    public void close() {
    }

    public boolean requiresLayout() {
        return false;
    }
}

希望它将来对某人有所帮助或帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多