maven打可执⾏的jar包以及classpath设置
⼀  将maven构建的⼯程打成jar包,并使⽤脚本做定时任务
1.⾸先将maven搭建的⼯程打成jar
需要在将该⼯程所⽀持的类库打在⼀个包中(默认情况下,maven在做mvn pakage时,只是将项⽬编译打包到⼀个jar中,其他的类库则需要引⽤才⾏)。
在l中加⼊以下插件
1. <plugin>
2.
3.    <artifactId>maven-assembly-plugin</artifactId>
4.
5.    <configuration>
6.
7.        <appendAssemblyId>false</appendAssemblyId>
8.
9.        <descriptorRefs>
10.
11.            <descriptorRef>jar-with-dependencies</descriptorRef>
12.
13.        </descriptorRefs>
14.
15.        <archive>
16.
17.            <manifest>
18.
19.                <mainClass>cn.vsp.TestMain</mainClass>
20.
21.            </manifest>
22.
23.        </archive>
24.
25.    </configuration>
26.
27.    <executions>
28.
29.        <execution>
30.
31.            <id>make-assembly</id>
32.
33.            <phase>package</phase>
maven打包本地jar包
34.
35.            <goals>
36.
37.                <goal>assembly</goal>
38.
39.            </goals>
40.
41.        </execution>
42.
43.    </executions>
44.
45. </plugin>
上述代码中在<mainClass></mainClass>之间是填写程序的⼊⼝类,即含main⽅法的类
2.编辑完上述插件后,再执⾏
mvn assembly:assembly
这是就会在target⽬录下⽣成  *.jar ⽂件
3.运⾏jar⽂件
java -jar *.jar
4.做定时任务
如果是在linux系统中做定时任务:
第⼀种⽅式:可以写⼀个shell脚本直接运⾏该jar⽂件,shell脚本的编写可以参考我的linux svn完全备份和定时备份博⽂
第⼆种⽅式:
sudo crontab -l
*/1 * * * * *  sudo /usr/bin/java -jar  *.jar
上述代码为每分钟执⾏⼀次,路径修改为相应的路径。
⼆ maven使⽤制定的java版本,来编译
可以避免“不⽀持泛型,请使⽤ -source 5或更⾼版本以启⽤泛型)” 这种问题
在项⽬的l中,添加:
1. <build>
2. <plugins>
3. <plugin>
4. <groupId>org.apache.maven.plugins</groupId>
5. <artifactId>maven-compiler-plugin</artifactId>
6. <configuration>
7. <source>1.5</source>
8. <target>1.5</target>
9. </configuration>
10. </plugin>
11. </plugins>
12. </build>
三 设置classpath来运⾏jar
⼀、背景知识
归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应⽤层的可定制的安全机制.
⼆、Java虚拟机(JVM)寻Class的顺序
2.1 Bootstrap classes
属于Java 平台核⼼的class,⽐如java.lang.String等.及rt.jar等重要的核⼼级别的class.这是由JVM Bootstrap class loader来载⼊的.⼀般是放置在{java_home}\jre\lib⽬录下
2.2 Extension classes
基于Java扩展机制,⽤来扩展Java核⼼功能模块.⽐如Java串⼝通讯模块comm.jar.⼀般放置在{Java_home}\jre\lib\ext⽬录下
2.3 User classes
开发⼈员或其他第三⽅开发的Java程序包.通过命令⾏的-classpath或-cp,或者通过设置CLASSPATH环境变量来引⽤.JVM通过放置在{java_home}\lib\tools.jar 来寻和调⽤⽤户级的class.常⽤的javac也是通过调⽤tools.jar来寻⽤户制定的编译Java源程序.这样就引出了User class路径搜索的顺序或优先级别的问题.
2.3.1 缺省值:调⽤Java或javawa的当前路径(.),是开发的class所存在的当前⽬录
2.3.2 CLASSPATH环境变量设置的路径.如果设置了CLASSPATH,则CLASSPATH的值会覆盖缺省值
2.3.3 执⾏Java的命令⾏-classpath或-cp的值,如果制定了这两个命令⾏参数之⼀,它的值会覆盖环境变量CLASSPATH的值
这也是为什么应⽤程序打包成可执⾏的jar包后,不能引⽤第三⽅jar包的原因.
三、解决⽅案.
⾸先我们简要归纳⼀下,为了⽅便理解,简化⼀下上⾯描述的架构,
Java定义了三种级别的class,分别为BootStrap class,Extend Class,User class.
其中User class限制规则最复杂.在User class中可执⾏的jar包,更包含独⽴安全规则.所以解决⽅案基于Java三种不同级别的class扩展机制,有三种不同的⽅案.
3.1 BootStrap class扩展⽅案
Java 命令⾏提供了如何扩展bootStrap 级别class的简单⽅法.
-Xbootclasspath:基本核⼼的Java class 搜索路径.不常⽤,否则要重新写所有Java 核⼼class
-Xbootclasspath/a: 后缀在核⼼class搜索路径后⾯.常⽤.
-Xbootclasspath/p:前缀在核⼼class搜索路径前⾯.不常⽤,避免引起不必要的冲突.
语法如下:
java –Xbootclasspath/a:/path/myclass/account.jar: -jar yourself.jar(Unix⽤:号隔开)
java –Xbootclasspath:/d:/myclass/account.jar; -jar yourself.jar(Window⽤;号隔开)
3.2 extend class 扩展⽅案
Java exten class 存放在{Java_home}\jre\lib\ext ⽬录下.当调⽤Java时,对扩展class路径的搜索是⾃动的.总会搜索的.这样,解决的⽅案就很简单了,将所有要使⽤的第三⽅的jar包都复制到ext ⽬录下.
3.3 User class扩展⽅案
当使⽤-jar执⾏可执⾏Jar包时,JVM将Jar包所在⽬录设置为codebase⽬录,所有的class搜索都在这个⽬录下开始.所以如果使⽤了其他第三⽅的jar包,⼀个⽐较可以接受的可配置⽅案,就是利⽤jar包的Manifest扩展机制.步骤如下
1.将需要的第三⽅的jar包,复制在同可执⾏jar所在的⽬录或某个⼦⽬录下.
⽐如:jar 包在 d:\crm\luncher.jar 那么你可以把所有jar包复制到d:\crm⽬录下或d:\crm\lib ⼦⽬录下.
2.修改Manifest ⽂件
在Manifest.mf⽂件⾥加⼊如下⾏
Class-Path:classes12.jar lib/class12.jar
3.4 User class扩展⽅案⼆
直接使⽤命令⾏模式来指定classpath以及要运⾏的main⽅法
windows:
java -cp "Test.jar;lib/*" my.package.MainClass
Under Linux:
java -cp  "Test.jar:lib/*" my. package. MainClass

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。