- 浏览: 67817 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
bo_hai:
assembly:single 不包含源代码,只包含依赖的cl ...
关于创建可执行的jar文件 -
lsy:
相当详细的好文!
关于创建可执行的jar文件 -
steven0lisa:
学习了。不过在有动态代码生成的项目中,就要谨慎用了。
Hide Method(隐藏方法) -
steven0lisa:
好久没看源代码了,没记错的话,因为是由以下原因造成的:1.ke ...
编码最佳实践系列之二 -
steven0lisa:
最后一点确实很有艺术,学习了~~~
编码最佳实践系列之一
上周四下午,放翁同学在TOP群中问了这样一个小问题,聊天记录摘录如下:
有同学知道如何用maven来将第三方jar的代码也打入到生成的项目jar中?就好比eclipse可以直接将部分依赖打入到项目jar中
一看到打包,对于jar类型的项目,运行mvn package,就等同于运行mvn jar:jar,那放翁同学的问题,一定是与jar插件有关了,在Maven官方网站,查阅了一下jar插件的相关文档,未果。
临近下班时,我找放翁同学当面了解了一下他真正的需求,就是把该项目的依赖的源码都打入到一个可执行的jar包中,我看了看Maven官方网站的插件列表,以前对assembly插件有点印象,这个插件或许可以胜任放翁的需求,就直接告诉他,试试这个插件吧,第二天早上上班过来,一问放翁,这个东东确实管用,解决了放翁同学的问题。
我以前看过这个插件的文档,但自己却没有使用过,自己也动手Demo一下,和大家分享一下吧
- 创建一个jar项目
tonglin@tonglin-desktop:~$ mvn archetype:generate [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'archetype'. [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Default Project [INFO] task-segment: [archetype:generate] (aggregator-style) [INFO] ------------------------------------------------------------------------ [INFO] Preparing archetype:generate [INFO] No goals needed for project - skipping [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. [INFO] Setting property: velocimacro.messages.on => 'false'. [INFO] Setting property: resource.loader => 'classpath'. [INFO] Setting property: resource.manager.logwhenfound => 'false'. [INFO] [archetype:generate] [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) Choose archetype: ...... 15: internal -> maven-archetype-quickstart () ...... Choose a number: (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41) 15: : Define value for groupId: : com.taobao.top.appstore Define value for artifactId: : maven-test Define value for version: 1.0-SNAPSHOT: : Define value for package: com.taobao.top.appstore: : Confirm properties configuration: groupId: com.taobao.top.appstore artifactId: maven-test version: 1.0-SNAPSHOT package: com.taobao.top.appstore Y: : [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: com.taobao.top.appstore [INFO] Parameter: packageName, Value: com.taobao.top.appstore [INFO] Parameter: package, Value: com.taobao.top.appstore [INFO] Parameter: artifactId, Value: maven-test [INFO] Parameter: basedir, Value: /home/tonglin [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] ********************* End of debug info from resources from generated POM *********************** [INFO] OldArchetype created in dir: /home/tonglin/maven-test [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1 minute 27 seconds [INFO] Finished at: Tue Dec 22 11:33:19 CST 2009 [INFO] Final Memory: 8M/14M [INFO] ------------------------------------------------------------------------
通过archetype插件的交互操作,我们创建了一个jar项目,名字叫做maven-test
该原型默认会创建一个包含main函数的类,com.taobao.top.appstore.App,源代码如下:package com.taobao.top.appstore; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } }
这个类很简单,如果我们想生成可执行的jar文件,需要修改MENIFEST文件,这里我们需要配置jar插件,编辑pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ...... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ...... </project>
- 打包,创建可执行的jar文件
tonglin@tonglin-desktop:~/maven-test$ mvn package
查看jar文件的MENIFEST文件内容:
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: tonglin Build-Jdk: 1.6.0_16 Main-Class: com.taobao.top.appstore.App
- 运行
tonglin@tonglin-desktop:~/maven-test$ java -jar target/maven-test-1.0-SNAPSHOT.jar Hello World!
运行成功,这个类很简单,没有任何依赖,如果我们想做些更复杂的东西,首先我们需要
- 增加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ...... <dependencies> ...... <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.1</version> </dependency> ...... </dependencies> ...... </project>
- 生成Eclipse文件
tonglin@tonglin-desktop:~$ cd maven-test/ tonglin@tonglin-desktop:~/maven-test$ mvn eclipse:clean eclipse:eclipse
- 打开Eclipse,编辑com.taobao.top.appstore.App
package com.taobao.top.appstore; import org.apache.commons.lang.StringUtils; /** * Hello world! * */ public class App { public static void main( String[] args ) { final String x = StringUtils.center("Hello World!", 20); System.out.println( x ); } }
- 再次打包,运行
tonglin@tonglin-desktop:~/maven-test$ mvn package tonglin@tonglin-desktop:~/maven-test$ java -jar target/maven-test-1.0-SNAPSHOT.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils at com.taobao.top.appstore.App.main(App.java:13) Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... 1 more
运行失败,抛出异常说org.apache.commons.lang.StringUtils类找不到,我们需要将org.apache.commons.lang.StringUtils,添加到类路径,修改pom.xml
- 添加类路径
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ...... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ...... </project>
- 再次打包
tonglin@tonglin-desktop:~/maven-test$ mvn package
查看jar包的MENIFEST
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: tonglin Build-Jdk: 1.6.0_16 Main-Class: com.taobao.top.appstore.App Class-Path: commons-lang-2.1.jar
- 运行
tonglin@tonglin-desktop:~/maven-test$ java \-jar target/maven-test-1.0-SNAPSHOT.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils at com.taobao.top.appstore.App.main(App.java:13) Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) ... 1 more
运行仍旧失败,那如何把依赖的源代码也打到这个jar包中呢,这个时候,maven-assembly-plugin插件就派上用场了
- 配置maven-assembly-plugin
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ...... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> </build> ...... </project>
注意上面的jar-with-dependencies,这样就会把jar包和它的所有runtime依赖添加到一个jar包中了,
- 装配
tonglin@tonglin-desktop:~/maven-test$ mvn assembly:assembly [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'assembly'. [INFO] ------------------------------------------------------------------------ [INFO] Building maven-test [INFO] task-segment: [assembly:assembly] (aggregator-style) [INFO] ------------------------------------------------------------------------ [INFO] Preparing assembly:assembly [INFO] ------------------------------------------------------------------------ [INFO] Building maven-test [INFO] ------------------------------------------------------------------------ [INFO] [resources:resources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /home/tonglin/maven-test/src/main/resources [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /home/tonglin/maven-test/src/test/resources [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test] [INFO] Surefire report directory: /home/tonglin/maven-test/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.taobao.top.appstore.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.089 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0添加到类路径 [INFO] [jar:jar] [INFO] Building jar: /home/tonglin/maven-test/target/maven-test-1.0-SNAPSHOT.jar [INFO] [assembly:assembly] [INFO] Processing DependencySet (output=) [INFO] Building jar: /home/tonglin/maven-test/target/maven-test-1.0-SNAPSHOT-jar-with-dependencies.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9 seconds [INFO] Finished at: Tue Dec 22 13:56:56 CST 2009 [INFO] Final Memory: 13M/24M [INFO] ------------------------------------------------------------------------
运行上面的命令,就会在target目录下生成maven-test-1.0-SNAPSHOT-jar-with-dependencies.jar
- 运行
tonglin@tonglin-desktop:~/maven-test$ java -jar target/maven-test-1.0-SNAPSHOT-jar-with-dependencies.jar Hello World!
运行成功,一切OK,如果我们想在打包阶段,自动运行assembly插件的assembly目标,那么只需少许的改动
- 打包阶段自动运行assembly
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> ...... <build> <plugins> ...... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ...... </plugins> </build> ...... </project>
这样,我们再次运行:
tonglin@tonglin-desktop:~/maven-test$ mvn clean package [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building maven-test [INFO] task-segment: [clean, package] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean] [INFO] Deleting directory /home/tonglin/maven-test/target [INFO] [resources:resources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /home/tonglin/maven-test/src/main/resources [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/tonglin/maven-test/target/classes [INFO] [resources:testResources] [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory /home/tonglin/maven-test/src/test/resources [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /home/tonglin/maven-test/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /home/tonglin/maven-test/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.taobao.top.appstore.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.077 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /home/tonglin/maven-test/target/maven-test-1.0-SNAPSHOT.jar [INFO] [assembly:single {execution: make-assembly}] [INFO] Processing DependencySet (output=) [INFO] Building jar: /home/tonglin/maven-test/target/maven-test-1.0-SNAPSHOT-jar-with-dependencies.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 13 seconds [INFO] Finished at: Tue Dec 22 14:40:54 CST 2009 [INFO] Final Memory: 17M/34M [INFO] ------------------------------------------------------------------------
注意:上面配置package,运行的是assembly:single,而不是assembly:assembly,这两者有什么区别呢:
- assembly:assembly 这个目标会自动执行package生命周期
- assembly:single 这个目标仅会装配成jar-with-dependencies,我们不想让package阶段运行两次package,所以配置成这个
- 参考资料:
- maven-assembly-plugin:http://maven.apache.org/plugins/maven-assembly-plugin/
- maven-jar-plugin:http://maven.apache.org/plugins/maven-jar-plugin/
- 项目源代码:
- Windowd平台:maven-test.zip
- Linux平台:maven-test.tar.gz
希望这篇文章能够让有同样经历的同学,减少困惑,有任何问题请联系我!
- maven-test.tar.gz (1.3 KB)
- 下载次数: 28
- maven-test.zip (4.2 KB)
- 下载次数: 60
评论
很好的解决hadoop依赖第三方jar的问题。
楼主的step by step教程很好!
在eclipse里面直接打包,还可以用fatjar插件。
不过有一个问题: 装配完的jar名字除正常的外,还带了一个“...jar-with-dependencies.jar”, 请问下这个去掉?
不好意思,时到今日,才看到你的回复,可能你自己已经解决了这个问题,但是我还是把答案告诉你吧,也可以帮助其他有同样问题的同学。
其实这个问题很简单,只需要在assembly的configure节点加上appendAssemblyId,值为false,即:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <archive> <manifest> <mainClass>com.taobao.top.appstore.App</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
不过有一个问题: 装配完的jar名字除正常的外,还带了一个“...jar-with-dependencies.jar”, 请问下这个去掉?
发表评论
-
MemCached基础
2009-07-21 18:58 4045MemCached是什么? MemCached是一个高性能、 ... -
MemCache深入浅出
2009-07-20 18:55 0本文主要讲述的memcached的概念,安装、监控、分布式算法 ... -
编码最佳实践系列之二
2008-10-23 11:35 1184Map的迭代,使用map的entrySet,不用使用keyS ... -
编码最佳实践系列之一
2008-10-23 11:28 1189避免空指针: /** * 判断应用是否有月租 * ... -
编码中日志使用规范
2008-10-23 11:19 1707编码中请统一使用commons-logging包 日志声明 ... -
PMD 规则集——Optimization Rules
2008-09-03 11:18 4118Optimization Rules优化规则 These ... -
PMD
2008-09-01 14:23 2023PMD 扫描Java源代码并且寻找潜在的问题像: 可能存在的 ...
相关推荐
JAR文件包,及jar仓储详解+实例,JAR文件包,及jar仓储详解+实例.JAR文件包,及jar仓储详解+实例
完成逻辑层面的结构关系项目文件夹下新建classes文件用于存放编译后的class文件开始实际的步骤吧进入项目文件夹下的source文件夹中,执行javac -
本说明中包括了对jar文件的解释,以及如何创建可执行的jar文件和相关的jar命令,并有具体的例子拱对比参考。
java程序的jar包创建,详细介绍过程
如果不指定主类,它将被打包为一个不可执行的 jar 文件。 name参数是唯一必需的参数。 该脚本将创建一个名为[name]-[version].jar的 jar 文件。 该版本是从package.json文件中提取的。 "config": { "main_class": ...
创建可执行文件的多个选项。 带有 jpg、bmp 和 png 格式的位图。 为程序创建记录 配置保存在.bts文件中 Dakota es un proyecto hecho en java para covertir un archivo jar, en un executables de windows. ...
该项目提供了一个maven插件,该插件允许从OSGi捆绑包maven项目创建可执行的jar文件。 只需将所需的包指定为项目的运行时依赖项即可。 目标不是为所有可能的设置创建启动器-生成器,而是为maven项目创建可执行启动...
它将使用提供的jvm选项创建一个执行java -jar的可执行文件,因此您仍然需要在$PATH上使用java 。 用法 要生成可执行文件,只需合并: { :bin { :extra-deps {...
根据文章创建的模版工程文件,下载后可直接编辑main方法,根据自己的需求自定义逻辑内容,编译后获取independent.jar文件,修改配置文件后,通过java -jar independent.jar 执行命令,正常执行。
的Java应用程序部署于各个平台,仅需使用它们就很容易创建一个单一的可执行文件jar. 因而由于解开jar压缩得到的文件回创Jar极其简单易用, 附加功能: Jar2exe,生成Linux.sh ,生成MAC.App 只要完成以下四个步骤: 1) ...
合并JAR软件(JarSplice)把JAR文件融合在一起 JarSplice 是一个有用的工具,可帮助您合并 jar 和本机文件到单个可执行 jar 作为创建的。
可执行WAR文件的演示这是可执行WAR文件的演示。 它使用自定义类加载器从Web存档(WAR... JAR文件的典型位置没有MANIFEST.MF 。 它包含Main-Class条目,以表示包含main()方法的类。 此外,还有一个Bootstrap类,负责从备
Web前端使用了越来越多的JS或CSS如jQuery, Backbone.js 和Twitter Bootstrap等等,平时我们是将这些Web资源...Webjars多应用于基于Spring Boot创建微服务项目,需要打包所有资源为可执行的jar。 标签:WebJars
1、实现文件夹创建、删除、进入。 2、实现当前文件夹下的内容罗列,能够根据文件名、日期、大小,类型进行排序。 3、实现文件拷贝和文件夹拷贝(文件夹拷贝指深度拷贝,... 7、实现把项目导出为可执行的*.jar文件
Spring Boot部署教程 为了演示,我将使用我自己的纯粹用Java编写的项目,如果您对项目本身感兴趣,请参考的。 此仓库重点介绍如何使用... 首先,必须有maven plugin才能在pom.xml创建可执行jar文件: <groupId>o
创建一个可执行文件,例如changeFileNames.bat,并将以下内容放入文件中: java -cp "PathOfTheJarFile\changeFileNames.jar" changeFileNames或者,使用随附的changeFileNames.bat文件,只需修改jar文件的路径以...
文件合并将多个文件的内容合并为一个的 Java 可执行文件。编译javac FileMerge.java创建 JAR 文件jar cfm FileMerge.jar Manifest.txt FileMerge.class执行java -jar FileMerge.jar /path/to/file/1 ... /path/to/...
//创建可写工作表 Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容 ws.addCell(labelCF);//将Label写入sheet中 Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,a...
有关更多信息,包括下载可执行JAR文件的链接,请。从源构建下载并解压缩到目录中,该目录称为${ANT_HOME} 在nmonvisualizer的根目录中,运行${ANT_HOME}/bin/ant 。 这将在根目录中创建一个可执行的JAR文件。