如何用maven把依赖的jar包maven 编译jar包到最终生成的jar包中

如何用maven把依赖的jar包编译到最终生成的jar包中? - ITeye问答
使用maven-dependency-plugin,编译后依赖的jar包可以copy到某个目录下比如target/lib,但是我需要把依赖的jar包编译到项目最终生成的jar包中,改怎么用呢?或者有什么插件吗?
如果用的是m2eclipse的话,直接运行clean package即可打包(所依赖的包也会被打进去), 如果用命令行的话 mvn clean package
eclipse的话,官方的m2e就可以。
打jar包,war包什么的都不需要特别去在意,和非maven的方式一样,比如
export出去即可。
已解决问题
未解决问题2016年12月 Java大版内专家分月排行榜第二
2017年8月 Java大版内专家分月排行榜第三2017年4月 Java大版内专家分月排行榜第三2016年3月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。用户名:rickqin
文章数:74
评论数:14
访问量:159048
注册日期:
阅读量:1297
阅读量:3317
阅读量:586429
阅读量:472663
51CTO推荐博文
本文介绍通过maven将项目打成可执行jar包的方法。本文需要读者具备maven基础知识,了解maven的一般配置、插件配置,了解maven的phase、goal的概念,了解dependency和manifest的作用。先决条件:(本文所述方法适用于项目的特点)1、项目必须是maven项目;3、项目中必须有一个主入口类,在用户双击打包后的jar文件时可以被执行。打包:第一种情况:独立项目,且无第三方依赖包这种情况下,我们需要maven的maven-jar-plugin插件来帮我们打包。请在项目pom.xml中的plugin配置处加入如下内容:(注意看&!-- --&注释部分)...
&&&&&artifactId&maven-jar-plugin&/artifactId&
&&&&&version&2.3.2&/version&
&&&&&configuration&
&&&&&&&&&archive&
&&&&&&&&&&&&&manifest&
&&&&&&&&&&&&&&&&&addClasspath&true&/addClasspath&
&&&&&&&&&&&&&&&&&!--&如果项目带有3rd-party&lib,这些依赖将被放入lib文件夹&--&
&&&&&&&&&&&&&&&&&!--&注意:这个文件夹要随着jar文件一起distribute,否则jar文件运行时将报错&--&
&&&&&&&&&&&&&&&&&classpathPrefix&lib/&/classpathPrefix&
&&&&&&&&&&&&&&&&&mainClass&com.yourProjectPackage.YourEntranceClass&/mainClass&
&&&&&&&&&&&&&/manifest&
&&&&&&&&&/archive&
&&&&&/configuration&
...然后用mvn clean install来编译安装你的项目。命令执行结束后会生成一个jar文件,一个lib文件夹(如果你的项目引用了3rd-party dependencies的话)。双击jar文件,就立刻看到效果了。有界面的项目应该能看到主界面(如果你程序没错的话),没有界面的,应该可以从你机器的java console里看到相关信息,或者项目自身有log输出或具有神奇的效果的,可以直接去检视输出结果。第二种情况:项目+第三方依赖包这种情况就无法使用maven-jar-plugin插件来打包了。我们要用另一个插件maven-assembly-plugin。这个插件可以帮助我们灵活的打包我们的项目(不仅打包jar项目,还可以用于ear、war等项目的打包,本文只介绍如何打可执行jar包)。这里,我们使用此插件将我们的source code编译结果以及项目的dependencies打到一起,形成一个jar文件。下面就是项目的pom.xml中plugin的配置部分:&plugin&
&&&&&artifactId&maven-assembly-plugin&/artifactId&
&&&&&version&2.6&/version&
&&&&&configuration&
&&&&&&&&&!--&这个archive以及archive里面的设置很重要,没有这个配置,就无法生成可执行jar文件&--&
&&&&&&&&&archive&
&&&&&&&&&&&&&manifest&
&&&&&&&&&&&&&&&&&mainClass&com.your.package.YourEntranceClass&/mainClass&
&&&&&&&&&&&&&/manifest&
&&&&&&&&&/archive&
&&&&&&&&&!--&这个jar-with-dependencies是这个插件中预置的,不用管它,尽管用就好了&--&
&&&&&&&&&!--&当然,你也可以用自己的descriptor。如何用?自己去查这个插件的文档&--&
&&&&&&&&&descriptorRefs&
&&&&&&&&&&&&&descriptorRef&jar-with-dependencies&/descriptorRef&
&&&&&&&&&/descriptorRefs&
&&&&&/configuration&
&&&&&executions&
&&&&&&&&&execution&
&&&&&&&&&&&&&id&make-assembly&/id&
&&&&&&&&&&&&&!--&这里的phase和goals都是maven的基础概念,不懂的可以去看maven的文档&--&
&&&&&&&&&&&&&!--&总之,当你install你的project的时候,是会涵盖package&phase和single&goal的&--&
&&&&&&&&&&&&&phase&package&/phase&
&&&&&&&&&&&&&goals&
&&&&&&&&&&&&&&&&&goal&single&/goal&
&&&&&&&&&&&&&/goals&
&&&&&&&&&/execution&
&&&&&/executions&
&/plugin&添加了此plugin之后,就可以clean install你的maven项目了。然后在maven命令执行结束后的console里会找到类似以下内容:--- maven-install-plugin:2.4:install (default-install) @ MvnCfgSwitcher ---Installing F:\uuuu\vvvv\Wwwww\target\Wwwww-1.0-SNAPSHOT.jar to Y:\mvn_repo\com\yourname\Wwwww\1.0-SNAPSHOT\Wwwww-1.0-SNAPSHOT.jarInstalling F:\uuuu\vvvv\Wwwww\pom.xml to Y:\mvn_repo\com\yourname\Wwwww\1.0-SNAPSHOT\Wwwww-1.0-SNAPSHOT.pomInstalling F:\uuuu\vvvv\Wwwww\target\Wwwww-1.0-SNAPSHOT-jar-with-dependencies.jar to Y:\mvn_repo\com\yourname\Wwwww\1.0-SNAPSHOT\Wwwww-1.0-SNAPSHOT-jar-with-dependencies.jar其中蓝色标识部分就是生成的all-in-one的可执行jar文件。快双击打包结果试试看吧,亲!本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)使用MAVEN打包可执行的jar包 - 简书
使用MAVEN打包可执行的jar包
非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都会被执行。
工程打包示例
目录结构示例
+ src/main/java/
+ com.some.package
+ src/main/resources/
- settings.properties
- applicationContext.xml
- startup.bat
打包后的期望结果
- settings.properties
- applicationContext.xml
- project.jar
- startup.bat
project.jar中不包含配置文件。
pom文件中打包相关的配置
&!-- 编译插件 --&
&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&
&!-- 项目依赖插件
&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&
&goal&copy-dependencies&/goal&
&configuration&
&!-- 拷贝项目依赖包到lib/目录下 --&
&outputDirectory&${project.build.directory}/lib&/outputDirectory&
&excludeTransitive&false&/excludeTransitive&
&stripVersion&false&/stripVersion&
&/configuration&
&/execution&
&/executions&
&!-- 项目资源插件 --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-resources-plugin&/artifactId&
&version&2.6&/version&
&executions&
&execution&
&id&copy-resources&/id&
&phase&package&/phase&
&goal&copy-resources&/goal&
&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&
&goal&copy-resources&/goal&
&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&
&!-- 打包插件 --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-jar-plugin&/artifactId&
&version&2.4&/version&
&configuration&
&!-- 生成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&
&/plugins&
&!-- 解决eclipse下maven插件兼容性问题 --&
&pluginManagement&
&!-- Ignore/Execute plugin execution --&
&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&
&goal&copy-dependencies&/goal&
&/pluginExecutionFilter&
&ignore /&
&/pluginExecution&
&/pluginExecutions&
&/lifecycleMappingMetadata&
&/configuration&
&/plugins&
&/pluginManagement&
打包命令mvn clean package
附录1 启动命令bat文件编写
REM 关闭输出
REM 设置启动时使用的jdk。如果不设置,则使用系统变量中设置的jdk
set path=../jdk.1.7.80/bin
set classpath=../jdk.1.7.80/jre/lib
REM 最基本的jar包启动命令,使用MANIFEST中的入口类启动
java -jar project.jar
REM 指定jar包的某个类作为入口启动
java -cp project.jar some.package.some.class.MyClass
REM 设置jvm参数并启动jar包
java -Xms256m -Xmx512m -jar project.jar
REM 开启输出
附录2 maven打包时的文件拷贝
通常打包外部资源文件时,都使用maven-dependency-plugin或是maven-resources-plugin插件。但是项目中遇见一个问题,在打包jnotify的动态链接库时,使用上面两个插件进行文件拷贝时,程序会无法识别到打包后dll文件。多次尝试后使用了maven-antrun-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&
&goal&run&/goal&
&configuration&
&echo message="copy native libraries" /&
&copy todir="${project.build.directory}/lib"&
&fileset dir="${basedir}/lib"&&/fileset&
&/configuration&
&/execution&
&/executions&

我要回帖

更多关于 maven依赖jar包下载 的文章

 

随机推荐