¿Es posible llamar a los objetivos de Maven de Java, por ejemplo, puedo hacer el equivalente de:Calling objetivos Maven de Java
mvn clean package
de una clase Java?
gracias, Nick
¿Es posible llamar a los objetivos de Maven de Java, por ejemplo, puedo hacer el equivalente de:Calling objetivos Maven de Java
mvn clean package
de una clase Java?
gracias, Nick
absolutamente, es necesario utilizar el Maven Embedder API.
enlace de Actualización es http://maven.apache.org/ref/3-LATEST/maven-embedder/index.html
No recomendaría utilizar MAVEN CLI
, ya que funciona de manera diferente en comparación con la línea de mando alternativo. Por ejemplo:
Con CLI, quiero reproducir "mvn dependency:resolve validate"
cli.doMain(
new String[]{
"dependency:resolve", // download deps if needed
"validate"}, // just validates, no need even to compile
projectPath ...
Pero en realidad a ir todo las carpetas (recursivamente) y a tratar de validar todos los proyectos ahí, incluso si no quiero que . Si ocurre algún error, falla.
Si, sin embargo, intenta hacer lo mismo simplemente con la línea de comandos - invocará solamente pom.xm y voluntad acabado con éxito (incluso si algún proyecto dentro 'ProjectPath' no se puede resolver
Con. CLI
no podía soportar a utilizar "f" bandera para especificar en particular pom.xml
Esto es bastante bueno para mí:
private int resolveAsCommandLine() {
try {
String command = "mvn " +
"-f " + projectPath + "\\pom.xml " +
"-Dmaven.repo.local=" + localRepoPath + "\\repository " +
"-Dmaven.test.skip=true " + // ignore tests
"dependency:resolve " + // download deps if needed
"validate";
System.out.println("%> Executing command: '" + command + "'...");
Process p = Runtime.getRuntime().exec(// "cmd - for windows only"
"cmd /c " + command
);
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = in.readLine()) != null) {
System.out.println(line);
if(line.contains("[ERROR]")) return ERROR_STATUS;
if(line.contains("BUILD FAILURE")) return ERROR_STATUS;
if(line.contains("BUILD SUCCESS")) return OK_STATUS;
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return ERROR_STATUS;
}
return ERROR_STATUS;
}
Tu respuesta es antigua, por lo que es probable que maven integrado haya mejorado. Ahora, la opción '-f' funciona fantásticamente, incluso con maven integrado. Utilicé una ruta absoluta (nunca he probado una ruta relativa). – djeikyb
Esto es fácil :)
códigoJava
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"clean", "package"}, "project_dir", System.out, System.out);
configuración del proyecto:
<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>
ejemplo Totalmente de trabajo: https://github.com/mariuszs/maven-cli-example
1 Gracias, lo que puede ser que necesite. – KLE
Gracias - ¡eso debería ser el truco! – eldoctoro
Es posible que esta ya no sea la respuesta correcta. Parece que maven-embedder se ha ido de Maven3: http://stackoverflow.com/questions/4206679/can-anyone-give-a-good-example-of-using-org-apache-maven-cli-mavencli-programatt – jbandi