代码之家  ›  专栏  ›  技术社区  ›  Searene

有没有什么方法可以使用maven api将maven项目打包到jar中?

  •  0
  • Searene  · 技术社区  · 6 年前

    假设我有一个maven项目位于 /home/admin/projects/maven-sample-project ,我可以使用以下命令将项目打包到jar。

    mvn clean package
    

    现在我想用Java和相关的maven api来实现,有没有类似的东西?

    MavenProject mavenProject = new MavenProject("/home/admin/projects/maven-sample-project");
    mavenProject.clean();
    mavenProject.package(jarLocation = "/home/admin/projects/maven-sample-project/target/maven-sample-project-1.0.0-SNAPSHOT.jar");
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Searene    6 年前

    正如khmarbaise所提到的,maven invoker能够解决这个问题。

    首先在 pom.xml 文件。

    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-invoker</artifactId>
        <version>3.0.1</version>
    </dependency>
    

    然后创建一个新类。

    import org.apache.maven.shared.invoker.*;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class MavenRunner {
    
        public static final String MAVEN_COMMAND_CLEAN = "clean";
        public static final String MAVEN_COMMAND_PACKAGE = "package";
    
        public static void run(String mavenProjectLocation, List<String> goals) throws MavenInvocationException {
            Invoker invoker = getInvoker(mavenProjectLocation);
            InvocationRequest request = getInvocationRequest(mavenProjectLocation, goals);
            InvocationResult result = invoker.execute(request);
            if ( result.getExitCode() != 0 )
            {
                String exceptionMsgPrefix = String.format("Failed to run maven commands, mavenProjectLocation: %s, goals: %s.", mavenProjectLocation, goals);
                if ( result.getExecutionException() != null )
                {
                    throw new MavenInvocationException(exceptionMsgPrefix + "exception: " + result.getExecutionException());
                }
                else
                {
                    throw new MavenInvocationException(exceptionMsgPrefix + "exit code: " + result.getExitCode());
                }
            }
        }
        private static Invoker getInvoker(String mavenProjectLocation) {
            Invoker invoker = new DefaultInvoker();
            invoker.setLocalRepositoryDirectory(new File(mavenProjectLocation));
            // replace it with yours
            invoker.setMavenHome(new File("/home/admin/apps/apache-maven-3.5.2"));
            return invoker;
        }
        private static InvocationRequest getInvocationRequest(String mavenProjectLocation, List<String> goals) {
            InvocationRequest request = new DefaultInvocationRequest();
            request.setBaseDirectory(new File(mavenProjectLocation));
            request.setGoals(goals);
            return request;
        }
    }
    

    用法:

    String mavenProjectLocation = "/home/admin/projects/maven-sample-project";
    List<String> goals = Arrays.asList(MavenRunner.MAVEN_COMMAND_CLEAN, MavenRunner.MAVEN_COMMAND_PACKAGE);
    MavenRunner.run(mavenProjectLocation, goals);