MAVEN打包可执行的jar包
来源:互联网 发布:阿里云域名邮箱 编辑:程序博客网 时间:2024/05/18 17:01
说明
非web项目中经常遇到需要将工程打包成一个可执行jar包(通过在命令行执行java命令进行启动)的情况。
一个可执行的jar包,需要满足以下条件:
- 在jar包中的/META-INF/MANIFEST.MF元数据文件中必须保护Main-Class启动入口类信息
- 项目的所有依赖都必须包含在Classpath中。即依赖必须都被描述MANIFEST于.MF文件中的Class-Path下
Maven中可以通过许多插件完成打包任务,如强大的maven-assembly-plugin等。具体使用方式,可以参见各插件的说明。
基础概念:maven的生命周期与插件
Maven将工程的构建过程分为不同的生命周期(LifeCycle),每个生命周期中又划分为不同的阶段(Phase)。
LifyCycle之间互相独立,且没有明确的顺序关系,而每个LifeCycle中的Phase间则存在明确的顺序关系,且必须依序执行。
Maven内置了三个LifyCycle,如default(build)构建,clean清理, site生成文档与站点。
以default为例,其内置的phase主要包含有: validate,compile,test,package,intergration-test,verify,install,deploy.这些phase在项目build时会依次执行 。
Maven所定义的LifeCycle与Phase只是抽象的概念,不涉及具体的功能。而功能的实现则由插件(Plugin)负责。
一个Plugin可以实现多个目标(Goal), Goal可以绑定在多个Phase上, 每个Phase下也可以包含多个Goal。可以将Phase视为Goal的容器。
Goal是Maven里面最小的任务单位,相关于Ant的target。Goal与Goal之间是互相独立的。单独执行某个Goal不会导致其他Goal被执行。
当我们对一个工程执行打包命令mvn package时, maven将从validate阶段开始,一个阶段一个阶段(compile, test)的执行,直至到达package阶段。
在执行到compile阶段时,插件maven-compiler-plugin的compile goal会被执行,因为这个goal是绑定在compile阶段。
同理,当执行到package阶段时,插件maven-dependency-plugin与maven-resources-plugin的相关goal都会被执行。
工程打包示例
目录结构示例
project/ + src/main/java/ + com.some.package + src/main/resources/ - settings.properties - applicationContext.xml - startup.bat - pom.xml
打包后的期望结果
target/ + conf/ - settings.properties - applicationContext.xml + lib/ - project.jar - startup.bat
project.jar中不包含配置文件。
pom文件中打包相关的配置
<build> <plugins> <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> <compilerArguments> <verbose /> <bootclasspath>${java.home}/lib/rt.jar</bootclasspath> </compilerArguments> </configuration> </plugin> <!-- 项目依赖插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <!-- 表示是否不包含间接依赖的包 --> <stripVersion>false</stripVersion> <!-- 去除版本信息 --> </configuration> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 拷贝项目依赖包到lib/目录下 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeTransitive>false</excludeTransitive> <stripVersion>false</stripVersion> </configuration> </execution> </executions> </plugin> <!-- 项目资源插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <encoding>UTF-8</encoding> <!-- 拷贝项目src/main/resources/下,除.bat以外的所有文件到conf/目录下 --> <outputDirectory>${project.build.directory}/conf</outputDirectory> <resources> <resource> <directory>src/main/resources/</directory> <filtering>true</filtering> <excludes> <exclude>*.bat</exclude> </excludes> </resource> </resources> </configuration> </execution> <execution> <id>copy-command</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <encoding>UTF-8</encoding> <!-- 只拷贝项目src/main/resources/目录下的.bat文件到输出目录下 --> <outputDirectory>${project.build.directory}</outputDirectory> <resources> <resource> <directory>src/main/resources/</directory> <filtering>true</filtering> <includes> <include>*.bat</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- 打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <!-- 生成MANIFEST.MF的设置 --> <manifest> <!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 --> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- jar启动入口类--> <mainClass>com.some.package.some.class.Main</mainClass> </manifest> <manifestEntries> <!-- 在Class-Path下添加配置文件的路径 --> <Class-Path>conf/</Class-Path> </manifestEntries> </archive> <includes> <!-- 打jar包时,只打包class文件 --> <include>**/*.class</include> </includes> </configuration> </plugin> </plugins> <!-- 解决eclipse下maven插件兼容性问题 --> <pluginManagement> <plugins> <!-- Ignore/Execute plugin execution --> <plugin> <groupId>org.eclipse.m2e</groupId> <artifactId>lifecycle-mapping</artifactId> <version>1.0.0</version> <configuration> <lifecycleMappingMetadata> <pluginExecutions> <!-- copy-dependency plugin --> <pluginExecution> <pluginExecutionFilter> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <versionRange>[1.0.0,)</versionRange> <goals> <goal>copy-dependencies</goal> </goals> </pluginExecutionFilter> <action> <ignore /> </action> </pluginExecution> </pluginExecutions> </lifecycleMappingMetadata> </configuration> </plugin> </plugins> </pluginManagement> </build>
打包命令mvn clean package
附录1 启动命令bat文件编写
REM 关闭输出@echo offREM 设置启动时使用的jdk。如果不设置,则使用系统变量中设置的jdkset path=../jdk.1.7.80/binset classpath=../jdk.1.7.80/jre/libREM 最基本的jar包启动命令,使用MANIFEST中的入口类启动java -jar project.jarREM 指定jar包的某个类作为入口启动java -cp project.jar some.package.some.class.MyClassREM 设置jvm参数并启动jar包java -Xms256m -Xmx512m -jar project.jarREM 开启输出echo on
附录2 maven打包时的文件拷贝
通常打包外部资源文件时,都使用maven-dependency-plugin
或是maven-resources-plugin
插件。但是项目中遇见一个问题,在打包jnotify的动态链接库时,使用上面两个插件进行文件拷贝时,程序会无法识别到打包后dll文件。
多次尝试后使用了maven-antrun-plugin
进行拷贝,问题得到解决。其拷贝配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <id>copy-native-libraries</id> <phase>package</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <echo message="copy native libraries" /> <copy todir="${project.build.directory}/lib"> <fileset dir="${basedir}/lib"></fileset> </copy> </target> </configuration> </execution> </executions> </plugin>
- MAVEN打包可执行的jar包
- maven打包可执行jar包
- maven 打包可执行jar包
- maven打包一个包含依赖jar包的可执行jar
- maven 打包可执行的jar
- eclipse使用MAVEN打包可执行的jar包
- eclipse使用MAVEN打包可执行的jar包
- eclipse使用maven打包可执行的jar包
- Maven-----可执行Jar包打包插件
- maven 打包可执行jar
- maven打包可执行jar
- Maven 打包可执行jar
- maven 打包可执行jar
- Maven打包可执行jar,包含依赖jar包
- maven 打包jar文件(含可执行jar包)
- maven 打包可执行jar的方法
- maven 打包可执行jar的方法
- maven 打包可执行jar的方法
- 性能测试 lua VS java VS nodejs VS c++
- 安装oracle无法使用命令/usr/bin/xdpyinfo自动检查显示器颜色
- struts标签,ognl表达式,el表达式,jstl表达式的区别
- MySql学习知识
- 解决ADB server didn't ACK问题,连上手机问题
- MAVEN打包可执行的jar包
- [刷题]Fast Power
- Java反射之 getMethod() 与invoke的使用
- 浅析Web工程目录和tomcat目录
- HTTP 协议中的 Transfer-Encoding
- CocoaPods的一些略为高级一丁点的使用
- http与https的区别
- SpannableString 给TextView添加不同的显示样式
- To and Fro-2039