If there is a requirement to call through code maven command , To upload jar Package or do something else , How to implement ?
Call the command line, of course ,maven There's also an official program Apache Maven Invoker Implement similar requirements , But the premise is that the machine or container in which the service is running needs to have maven.
You may have heard of Write once, run anywhere. If not maven The environment won't work , There's no better way
Maven Embedder It's also maven An official project , Like the name , It's embeddable , That is, you don't need to rely on the outside maven. The project is a good project , But the problem is that there are too few official documents .
In case it gets sprayed , It's not said that embedding must be a better solution , After all, it's not possible to package all the dependencies that a project needs , We should choose according to the actual problems .
rely on
According to the official, it only needs maven-embedder
One dependency can , But actually it works , You'll find a lot of mistakes , It's not wordy here , Direct release of fully available dependencies .
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-compat</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-connector-basic</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-http</artifactId>
<version>1.4.1</version>
</dependency>
maven-compat
It's one used to keep up with Maven2 Compatible packages .
maven-resolver-connector-basic
and maven-resolver-transport-http
be used for deploy. If you only run to install, Unwanted deploy , These two dependencies can be removed . A lot of people on the Internet can use aether Dependencies in the project , Something like this
<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>
But actually aether This project has stopped , See Aether Termination Review, and Apache Maven Artifact Resolver It's a substitute .
Use
The code used is also very simple
public static void deploy(String path){
MavenCli cli = new MavenCli();
String mvnHome = MavenCli.USER_MAVEN_CONFIGURATION_HOME.getAbsolutePath();
System.getProperties().setProperty("maven.multiModuleProjectDirectory", mvnHome);
List<String> args = new ArrayList<>();
args.add("clean");
args.add("deploy");
int status = 0;
try {
status = cli.doMain(args.toArray(new String[]{}), path, System.out, System.out);
}catch (Exception e){
logger.error(e.getMessage(),e);
throw e;
}
if (status != 0) {
throw new RuntimeException("maven error ");
}
}
maven.multiModuleProjectDirectory
This system variable , If it is set, there is no need to set it , But if not, you need to set up , Otherwise, an error will be reported .
In addition, because deploy
The account and password of the server are involved , Configuration files may be required , There are two solutions :
- adopt
-s,--settings
To specify the path of the configuration file . - Put the configuration file in maven home in .
If password encryption is used , It also involves settings-security.xml
file , It doesn't work with the first one ( Mainly I didn't succeed ), Put both files in maven home No problem . default maven home It's in the user directory .m2
Catalog .
Common mistakes
-Dmaven.multiModuleProjectDirectory system property is not set.
As mentioned earlier , Set the system variable , The value is maven home The corresponding path can be .
No implementation for org.apache.maven.repository.RepositorySystem was bound.
Add dependency , Although this is a maven 2 Compatible packages for , But no other alternative has been found .
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-compat</artifactId>
<version>3.6.3</version>
</dependency>
No connector factories available、No transporter factories registered
Both of these are errors reported during deployment , Add the following dependency to solve the problem
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-connector-basic</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.resolver</groupId>
<artifactId>maven-resolver-transport-http</artifactId>
<version>1.4.1</version>
</dependency>