Exec Maven Plugin全面解析和使用示例
1.为什么使用exec?
现在的工程往往依赖 众多的jar包,不像war包工程,对于那些打包成jar包形式的本地java应用来说,通过java命令启动将会是一件极为繁琐的事情,原因很简单,太 多的依赖让参数-classpath变得异常的恐怖。为此,在发布应用时,一般使用两种方法来启动应用程序:一种是通过工具将工程及其所有依赖的jar包 打包成一个独立的jar包(在maven里有两个插件assemly和shade是用来完成这种工作的);另一种方法是编写一个run.bat文件,文件 包含一个启动应用的java命令,很显然,这个命令的classpath必须包含全部依赖的jar包。但是对于尚处在开发阶段的应用来说,第一种方法需要 将所有jar包解压再重新打包,因此非常耗时,特别是工程非常大的时候。第二种方法的问题在于,对处在开发阶段的工程,经常需要引入或升级jar包,这就 需要频繁地修改run.bat文件。实际上,对于使用maven管理的工程,完全可以通过maven来获取工程的classpath,简化应用程序的启动 命令,这正是maven插件exec被设计出来的主要动机。使用exec比使用java命令去启动应用程序最大的优势就在于:你不需要再去为-classpath而伤脑筋了。
2. exec:exec和exec:java的区别
exec 主要由两个goal组成:exec:exec和exec:java。你应该如何选择呢?首先,你需要记住,exec:exec总是比exec:java强 大而灵活,这一点会在后面的示例中体现出来,除此之外,两者的主要区别是在线程管理上:exec:exec总是启动一个新的线程,并且在只剩下守护线程的 时候从VM上退出(关闭应用程序)。而对于exec:java,当所有非守护线程结束时,守护线程会被joine或interrupt,应该程序不会关 闭。但是对于一般的使用者来说,这种差别并不重要。对于两者的选择,一般来说,如果你的工程启动非常简单,不需要设置jvm参数、系统属性、命令行参数, 那么就用exec:java,你只需要指定一下mainClass,一切就OK了。例如这面这段配置:
[html] view plaincopy
-
<plugin>
-
<groupId>org.codehaus.mojo</groupId>
-
<artifactId>exec-maven-plugin</artifactId>
-
<version>1.2.1</version>
-
<executions>
-
<execution>
-
<goals>
-
<goal>java</goal>
-
</goals>
-
</execution>
-
</executions>
-
<configuration>
-
<mainClass>com.yourcompany.app.Main</mainClass>
-
</configuration>
-
</plugin>
如果恰恰相反,你的应用程序启动非常复杂,需要设置jvm参数、系统属性、命令行参数等,那么你就需要使用exec:exec了,下面我们看一个exec:exec的“好”“大”“全”示例。
3.一个“好”“大”“全”的例子
假定我们的应用程序是通过这样的java命令来启动的:
java -DsystemProperty1=value1 -DsystemProperty2=value2 -XX:MaxPermSize=256m -classpath .... com.yourcompany.app.Main arg1 arg2
这 个启动命令先后为应用程序设置了必要的系统属性systemProperty1和systemProperty2,然后设置了一个jvm参数,接着是程序 的classpath,....省略的部分就是我不说你也能想到会有多么冗长的类路径了,再接下来是程序入口--主类的类名,arg1 arg2是传给应用程序的命令行参数。
3.1. 在xml中配置:
首先我们来看一下如何在pom中通过配置来实现这个启动命令:
[html] view plaincopy
-
<plugin>
-
<groupId>org.codehaus.mojo</groupId>
-
<artifactId>exec-maven-plugin</artifactId>
-
<version>1.2.1</version>
-
<configuration>
-
<executable>java</executable> <!-- executable指的是要执行什么样的命令 -->
-
<arguments>
-
<argument>-DsystemProperty1=value1</argument> <!-- 这是一个系统属性参数 -->
-
<argument>-DsystemProperty2=value2</argument> <!-- 这是一个系统属性参数 -->
-
<argument>-XX:MaxPermSize=256m</argument> <!-- 这是一个JVM参数 -->
-
<!--automatically creates the classpath using all project dependencies,
-
also adding the project build directory -->
-
<argument>-classpath</argument> <!-- 这是classpath属性,其值就是下面的<classpath/> -->
-
<classpath/> <!-- 这是exec插件最有价值的地方,关于工程的classpath并不需要手动指定,它将由exec自动计算得出 -->
-
<argument>com.yourcompany.app.Main</argument> <!-- 程序入口,主类名称 -->
-
<argument>arg1</argument> <!-- 程序的第一个命令行参数 -->
-
<argument>arg2</argument> <!-- 程序的第二个命令行参数 -->
-
</arguments>
-
</configuration>
-
</plugin>
将上面的配置加到pom中并保存,然后执行:
mvn exec:exec
即可启动应用程序了。
3.2. 在命令行中配置:
除写在pom配置文件中,exec也支持更加灵活的命令行方式来启动,你可以在你的pom中只声明引入了exec插件,不提供任何配置内容,然后在命令行中设置相关参数,同样以上面的命令为例,如果使用命令行方式来配置,那么这个命令将会是:
mvn exec:exec -Dexec.executable="java" -Dexec.args="-DsystemProperty1=value1 -DsystemProperty2=value2 -XX:MaxPermSize=256m -classpath %classpath com.yourcompany.app.Main arg1 arg2"
怎么样,是不是看起来更加简洁?
注意:exec.args指的 是exec:exec的commandlineArgs参数,而我们上面xml配置中的参数是arguments,两者是不一样的,这种做法是比较好的, 因为exec规定:如果有commandlineArgs,将优先使用commandlineArgs,如果没有再去找是否配置了argument,这样 给我们在命令行执行不同设定参数的机会。下面是exec官网对此的相关说明:
1.If commandLineArgs is specified, it will be used as is, except for replacing %classpath with proper classpath using dependencies
2.Otherwise if the property exec.args is specified, it will be used
3.Otherwise the list of argument and classpath will be parsed and used
相关推荐
SSHExec Maven Plugin是一个用于在Maven构建过程中执行远程SSH命令和上传文件的插件。它依赖于Jsch库,这是一个Java实现的SSH2库,允许开发者通过SSH协议与远程服务器进行交互。这个插件极大地简化了在持续集成环境...
在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...
### Maven2配置指南知识点概述 #### 一、Maven简介 1. **Maven是什么?...通过以上知识点的学习,读者将对Maven的基本概念、安装使用以及项目管理有较为全面的理解,并能基于Maven进行基本的Java项目构建和管理。
Maven作为Java领域广泛使用的构建工具,以其强大的依赖管理和项目生命周期管理能力,成为多模块项目管理的理想选择。本教程将详细介绍如何使用Maven来管理多模块项目,并指导如何进行项目的启动与调试。 首先,理解...
- **站点生成和报告(Site Generation and Reporting)**:Maven可以通过`maven-site-plugin`插件自动生成项目的站点页面,展示项目的各种信息。 #### 四、定制Maven项目 **4.1 定义SimpleWeather项目** 定义一个简单...
Maven帮助插件提供了各种命令来帮助用户更好地理解和使用Maven,如`mvn help:describe`可以显示插件的详细信息。 **2.8.1 描述Maven插件** 使用`mvn help:describe -Dplugin=pluginId`命令可以查看特定插件的信息,...
总的来说,将Spring Boot应用打包成exe并作为Windows服务,是Java开发中的一项实用技能,它结合了Maven、Spring Boot、`exec-maven-plugin`、`launch4j`和`winsw`等多个工具,实现了从源代码到服务化的完整流程。...
### Maven 下载、安装、配置与使用教程 **一、Maven 概述** #### 1.1 Maven 定义 Maven是一款开源的项目管理和构建工具,...通过本文的介绍,相信读者已经对Maven有了较为全面的认识,并掌握了Maven的基本使用技巧。
查看源代码(SimpleWeather Source Code),添加资源文件(Add Resources),运行简单天气程序(Running the Simple Weather Program),其中会用到Maven Exec插件(The Maven Exec Plugin)。此外,定制还包括编写...
在`pom.xml`中添加`exec-maven-plugin`插件配置示例: ```xml ... ... <plugin> <groupId>org.codehaus.mojo <artifactId>exec-maven-plugin <version>3.0.0 <mainClass>...
在`maven-process-plugin-master`这个压缩包中,可能包含了示例的配置文件和启动脚本,供开发者参考学习。通过阅读和理解这些文件,开发者可以更好地掌握如何配置和使用`maven-process-plugin`来实现自动化环境部署...
最后,当我们的项目打包成JAR或WAR文件后,可以通过Maven的`exec-maven-plugin`插件来运行这个定时任务服务。或者,如果是在服务器上部署,可以将项目部署到Tomcat或其他Servlet容器中,让容器启动时自动启动Quartz...
大数据 Java Hive UDF 函数示例代码(手机号码脱敏)是指使用 Java 语言开发的用户定义函数(User Defined Function,UDF),该函数可以在 Hive 中使用,实现手机号码脱敏的功能。在本文中,我们将通过实例代码,...
总结来说,"Hello-World-Maven"项目是一个基础的示例,旨在帮助新手理解Maven项目的结构和工作原理,以及如何使用Maven进行项目构建和依赖管理。通过学习这个项目,开发者可以更好地理解和运用Maven,从而提高开发...
BPM Suite执行服务器示例目标此示例演示了使用Eclipse(JBoss Developer Studio)编写的项目,该项目使用kie-maven-plugin构建,部署到远程Maven存储库,然后部署到通过REST在“执行服务器”模式下运行的BPM Suite...
H2 和 Jetty 服务器的启动和关闭由jetty-maven-plugin和exec-maven-plugin ,应该与您的 CI 服务器一起使用。 bwertr kata 如果你想练习 bwertr kata 的不同部分,你可以使用带有各种标签的iteration分支作为起点...
在本文中,我们将深入探讨如何使用Jersey框架和Maven创建一个RESTful服务。Jersey是JAX-RS规范的官方实现,它提供了一种简便的方法来构建Web服务,特别是RESTful服务。Maven作为项目管理和构建工具,使得依赖管理和...
5. **coverage** - 可能是JaCoCo生成的覆盖率数据文件,这些文件通常以.exec格式存储,可以被工具进一步解析和展示。 ** 集成与应用 ** JaCoCo可以轻松地与持续集成工具(如Jenkins、Maven、Gradle)集成,使得在...