Может ли плагин Maven работать на JAR, созданном как часть сборки - PullRequest
2 голосов
/ 08 марта 2019

Я хочу создать плагин Maven, который будет запускаться только после релизной сборки моей фляги.Цель состоит в том, чтобы идентифицировать все классы в моем JAR, которые снабжены пользовательской аннотацией.Затем он вызовет REST API с подробной информацией об этих классах.

Я рассматривал использование javaparser для сканирования источника.Можно ли проверить встроенный файл JAR из плагина Maven.Таким образом, я мог бы использовать библиотеку Reflections (getTypesAnnotatedWith), и это немного упростило бы процесс.

Edit Я пытался использовать Aether, но столкнулся с проблемами

package mypackage.maven.plugins;

import java.net.MalformedURLException;
import java.util.Set;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.collection.DependencyCollectionException;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.impl.DefaultServiceLocator;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.transport.file.FileTransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.reflections.Reflections;
import org.reflections.scanners.Scanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ConfigurationBuilder;

import my.package.annotations.MyAnnotation;

@Mojo(name = "identify-checks")
public class MyCheckMojo extends AbstractMojo
{
    @Parameter(defaultValue = "${project}", required = true, readonly = true)
    MavenProject project;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException
    {                        
        RepositorySystem repoSystem = newRepositorySystem();

        RepositorySystemSession session = newSession( repoSystem );
        String coords = project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion();


        Dependency dependency = new Dependency( new DefaultArtifact(coords), "compile" );
        RemoteRepository central = new RemoteRepository.Builder( "central", "default", "http://myrepo:8081/nexus/content/repositories/" ).build();

        CollectRequest collectRequest = new CollectRequest();
        collectRequest.setRoot( dependency );
        collectRequest.addRepository( central );
        DependencyNode node;
        try
        {            
            node = repoSystem.collectDependencies( session, collectRequest ).getRoot();

            Artifact artifact = node.getArtifact();
            artifact.getArtifactId();

            ArtifactRequest artifactRequest = new ArtifactRequest();
            artifactRequest.setArtifact(artifact);
            ArtifactResult artifactResult = repoSystem.resolveArtifact(session, artifactRequest);
            artifact = artifactResult.getArtifact();

            ConfigurationBuilder configBuilder = new ConfigurationBuilder()
                    .addUrls(artifact.getFile().toURI().toURL())
                    .filterInputsBy(new FilterBuilder().include("my.package"))
                    .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner());

            Set<Scanner> scanners = configBuilder.getScanners();
            //SubTypesScanner = new SubTypesScanner(false);

            Reflections reflections = new Reflections(configBuilder);
                        //.setScanners(new SubTypesScanner(), new TypeAnnotationsScanner().filterResultsBy(myClassAnnotationsFilter)));
            Set<Class<?>> checks = reflections.getTypesAnnotatedWith(MyAnnotation.class, true);
            System.out.println("Number of checks is " + checks.size());
            for(Class<?> check : checks)
            {
                System.out.println(check.getName());
            }
            System.out.println("sdf");

        }
        catch (DependencyCollectionException e1)
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        catch (ArtifactResolutionException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (MalformedURLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static RepositorySystem newRepositorySystem()
    {
        DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
        locator.addService( RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class );
        locator.addService( TransporterFactory.class, FileTransporterFactory.class );
        locator.addService( TransporterFactory.class, HttpTransporterFactory.class );

        return locator.getService( RepositorySystem.class );
    }

    private static RepositorySystemSession newSession( RepositorySystem system )
    {
        DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();

        LocalRepository localRepo = new LocalRepository( "C://maven_repository//repository" );
        session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );

        return session;
    }
}

1 Ответ

1 голос
/ 08 марта 2019

Да, либо путем ссылки на местоположение артефакта (обычно обозначается ${project.build.directory}/${project.build.finalName} свойствами), либо с помощью ArtifactResolver в плагине. Вы можете взглянуть на исходный код плагина Apache Tomcat Maven , который ищет артефакт как в локальном, так и в удаленном репозитории Maven.

Обратите внимание, что вы должны связать свой пользовательский плагин после фазы package, обычно в фазе verify.

...