Alguém pode dar um bom exemplo de uso de org.apache.maven.cli.mavencli programaticamente?

StackOverflow https://stackoverflow.com/questions/4206679

  •  25-09-2019
  •  | 
  •  

Pergunta

Estou tentando criar um plugin Intellij que precisa executar metas maven no projeto atual. Toda a palestra nos Intertubes recomenda o uso do MavenEmbedder. Boa sorte com isso. A versão 2.0.4 não é bem suportada e não há referências sobre como usá -la.

Dei um giro e corri para uma parede onde o incorporador não havia sido inicializado com todos os campos de que precisa. Injeção reflexiva para membros privados? Incrível! Por que alguém precisaria de uma maneira óbvia de inicializar um objeto?

Parece que algumas pessoas estão usando uma versão 2.1 com algum sucesso. Não consegui encontrar isso em uma jarra ou mesmo fontes.

Fui ver a versão 3.0 do projeto de incorporação: http://maven.apache.org/ref/3.0-beta-3/maven-embedder/ Ele acaba com o objeto MavenEmbedder todos juntos e parece apoiar apenas o acesso através dos métodos principais ou de domínio no Mavencli. Alguém usou esses métodos e pode dar alguns conselhos?

Foi útil?

Solução

Sim, isso não está muito em termos de documentação de Mavencli. A API é significativamente mais simples, mas eu ainda gostaria de alguns exemplos. Aqui está um que funciona ...

MavenCli cli = new MavenCli();
int result = cli.doMain(new String[]{"compile"},
        "/home/aioffe/workspace/MiscMaven",
        System.out, System.out);
System.out.println("result: " + result);

É preciso um sol e executa a fase 'compilação' ...

Outras dicas

Configuração do Maven de trabalho para maven 3.1.1

Dependências

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-wagon</artifactId>
        <version>0.9.0.M2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http-lightweight</artifactId>
        <version>2.5</version>
    </dependency>
</dependencies>

Código

MavenCli cli = new MavenCli();

cli.doMain(new String[]{"clean", "compile"}, "project_dir", System.out, System.out);

As informações da matriz de dependência para escopos fornecidas e componentes adquiridos dinamicamente podem ser um pouco confusos. Foi para mim, já que me pareceu que recebi todos os itens necessários por dependência direta ou transitiva, mas a resolução remota não funcionou.

Eu queria pular para o Maven 3.3.3 (mais recente a partir de 2015-05-25). Fiz o trabalho sem os erros do SISU que se apresentaram quando tentei atualizar otimistas para as versões atuais das coisas especificadas aqui (e em outros lugares). Este é um projeto com uma tag que funcionou com o exemplo especificado a partir de hoje usando o JDK8.

https://github.com/mykelalvis/test-maven-embedder/tree/20150525-working

DEPS relevantes (SLF4J é apenas para que eu possa ver os logs)

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-basic</artifactId>
        <version>1.0.2.v20150114</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-wagon</artifactId>
        <version>1.0.2.v20150114</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http</artifactId>
        <version>2.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-provider-api</artifactId>
        <version>2.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http-lightweight</artifactId>
        <version>2.9</version>
    </dependency>   

Executando isso é:

rm -r ~/.m2/repository/org/apache/maven/plugins/maven-clean-plugin/
mvn exec:java

Provavelmente deveria ter feito algum tipo de teste de unidade.

Se alguém tiver uma solução superior para o Maven Incorporado 3.3.3 (ou seja, criou um conjunto menor ou mais orientado a alcance de dependências necessárias), publique-as.

Para desenvolver o comentário de @steveperkins e usar o maven versão 3.1.0,

Eu tive que excluir a dependência transitiva do Aether-Connector-Wagon para o Wagon-Provider-Api para fazer isso funcionar.

pom.xml:

(...)
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-embedder</artifactId>
    <version>3.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.eclipse.aether</groupId>
    <artifactId>aether-connector-wagon</artifactId>
    <version>0.9.0.M2</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-provider-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-http</artifactId>
    <version>2.5</version>
    <scope>test</scope>
</dependency>
(...)

E aqui está um exemplo java:

(...)
MavenCli cli = new MavenCli();

ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
ByteArrayOutputStream baosErr = new ByteArrayOutputStream();

PrintStream out = new PrintStream(baosOut, true);
PrintStream err = new PrintStream(baosErr, true);

cli.doMain( new String[] { "clean" }, new File("."), out, err );

String stdout = baosOut.toString("UTF-8");
String stderr = baosErr.toString("UTF-8");
(...)

Exemplo completo aqui

Existe uma matriz de dependência para cada versão do Maven-Embedder, por exemplo, para 3.2.5: http://maven.apache.org/ref/3.2.5/maven-embedder/dependencies.html

Com base nisso eu tinha que usar org.apache.maven:maven-embedder:jar:3.2.5, org.apache.maven:maven-aether-provider:jar:3.2.5, e org.apache.maven.wagon:wagon-provider-api:jar:2.8.

Ele também corrige a dependência da biblioteca de goiaba muito antiga, já que esta versão usa 18.0.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top