簡體   English   中英

如何將Maven構建輸出添加到插件類加載器?

[英]How to add maven build output to plugin classloader?

我在maven-antrun-plugin運行AntTask時遇到問題。 不幸的是,AntTask使用了插件類加載器來找到項目中的文件,但是當在插件中運行時,構建輸出不包含在插件的類路徑中。

Maven類加載指南

請注意,插件類加載器既不包含當前項目的依賴關系,也不包含其構建輸出。

...

插件可以自由決定是否進一步創建類加載器。 例如,一個插件可能想創建一個結合了插件類路徑和項目類路徑的類加載器。

誰能為我指出正確的方向,如何創建自己的maven-antrun-plugin版本,在該版本中,我可以創建結合了插件類路徑和項目類路徑的自己的類加載器? 我需要更新類加載器,以便當我的自定義antrun-plugin執行的類調用時:

getClass().getClassLoader().getResource()

classloader也會搜索build輸出文件夾。

經過幾個小時嘗試解決配置問題后,我忍不住想了一下,只寫了自己的插件來擴展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;
    }
}

希望它將來可能對某人有用或幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM