Sto usando Maven nel contesto di un altro strumento di costruzione (leiningen per Clojure, ma questo non dovrebbe importare), e mi piacerebbe sapere come chiamerei un plugin come dependency:build-classpath programmaticamente (ovvero tramite Maven-API, non tramite il comando mvn
).Come chiamare programmaticamente un'attività Maven
risposta
Vedere come viene implementato org.apache.maven.plugin.testing.AbstractMojoTestCase da maven-plugin-testing-harness. Ecco uno snippet di codice di alcuni dei miei test che potrebbe essere utile.
public abstract class JAXBGenerateTest extends AbstractMojoTestCase {
static {
System.setProperty("basedir", getBaseDir().getAbsolutePath());
}
protected MavenProjectBuilder mavenProjectBuilder;
protected void setUp() throws Exception {
super.setUp();
mavenProjectBuilder = (MavenProjectBuilder) getContainer().lookup(
MavenProjectBuilder.ROLE);
}
protected static File getBaseDir() {...}
/**
* Validate the generation of a java files from purchaseorder.xsd.
*
* @throws MojoExecutionException
*/
public void testExecute() throws Exception {
final File pom = new File(getBaseDir(),
"src/test/resources/test-pom.xml");
final ArtifactRepository localRepository = new DefaultArtifactRepository("local",
new File(getBaseDir(), "target/test-repository").toURI().toURL().toString() , new DefaultRepositoryLayout());
final MavenProject mavenProject = mavenProjectBuilder.build(pom, localRepository, null);
final XJC2Mojo generator = (XJC2Mojo) lookupMojo("generate", pom);
generator.setProject(mavenProject);
generator.setLocalRepository(localRepository);
generator.setSchemaDirectory(new File(getBaseDir(),"src/test/resources/"));
generator.setSchemaIncludes(new String[] { "*.xsd" });
generator.setBindingIncludes(new String[] { "*.xjb" });
generator.setGenerateDirectory(new File(getBaseDir(), "target/test/generated-sources"));
generator.setVerbose(true);
generator.setGeneratePackage("unittest");
generator.setRemoveOldOutput(false);
generator.execute();
}
}
Il Ant Maven tasks può darti un'idea su come farlo (DependenciesTask source). Un altro percorso può essere il PomModuleDescriptorParser utilizzato da Ivy.
Ecco una soluzione migliore: utilizzare la libreria Mojo-Executor. Espone una semplice API Java per richiamare i plugin Maven.
Utilizzare Maven Invoker API. È veloce e facile.
InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile(new File("/path/to/pom.xml"));
request.setGoals(Collections.singletonList("install"));
Invoker invoker = new DefaultInvoker();
invoker.setMavenHome(new File("/usr"));
try
{
invoker.execute(request);
}
catch (MavenInvocationException e)
{
e.printStackTrace();
}
pom.xml:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>2.1.1</version>
</dependency>
Questo sta creando un nuovo ciclo di vita. TFQ sta tentando di richiamare un mojo all'interno del ciclo di vita corrente. –
- 1. Chiamare programmaticamente lo storyboard in delegato
- 2. Heroku - Posso chiamare Maven da Procfile?
- 3. Chiamare foreach in maven-antrun-plugin
- 4. Come chiamare un obiettivo Maven all'interno di uno script Ant?
- 5. Come registrare programmaticamente PerformanceCounter
- 6. come attivare dropdownlist.selectedindexchanged evento programmaticamente
- 7. Come eliminare i file programmaticamente?
- 8. Privilegi Escalate programmaticamente OS X
- 9. Come dire programmaticamente quando FINGERPRINT_ERROR_LOCKOUT è scaduto su Android FIngerprintManager?
- 10. iOS scattare foto programmaticamente
- 11. Smontare programmaticamente CIL
- 12. Mostra tastiera iPhone programmaticamente
- 13. Avvia programmaticamente OSGi (Equinox)?
- 14. chiude programmaticamente l'app win8
- 15. Android Layout peso programmaticamente
- 16. Invia email automatica programmaticamente
- 17. Android: Ripple Background Programmaticamente
- 18. ng-flow upload programmaticamente
- 19. Come aggiungere una vista programmaticamente a RelativeLayout?
- 20. Come riavviare programmaticamente l'app asp.net core?
- 21. iOS: NSMutableAttributedString: come eliminare l'ultimo carattere programmaticamente?
- 22. Come trovare PPI programmaticamente con precisione
- 23. Come impostare i minuti in nsdate programmaticamente?
- 24. Come licenziare programmaticamente UIAlertController senza alcun pulsante?
- 25. Come faccio a rimborsare programmaticamente usando paypal?
- 26. Come uscire da un'app WPF programmaticamente?
- 27. Come ottenere OnClick() dai pulsanti aggiunti programmaticamente?
- 28. MySQL, C++ - Programmaticamente, come funziona MySQL Autoincrement?
- 29. Come ottenere il colore di accento programmaticamente?
- 30. Come rifiutare una chiamata programmaticamente in Android
questo solo elimina la necessità di eseguire un plugin Maven con la necessità di eseguire un altro Maven Plugin. –
@JensSchauder: No, non è così. Mojo-Executor fornisce una semplice API Java che richiama i plugin Maven per tuo conto. Richiamare i plug-in Maven richiede molto lavoro pesante! – Gili
Ok, non era chiaro dalla pagina del progetto per me. –