IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样:
1 <plugin>
2 <groupId>org.codehaus.mojo</groupId>
3 <artifactId>exec-maven-plugin</artifactId>
4 <version>1.2.1</version>
5 <executions>
6 <execution>
7 <goals>
8 <goal>exec</goal>
9 </goals>
10 </execution>
11 </executions>
12 <configuration>
13 <executable>java</executable>
14 <arguments>
15 <argument>-classpath</argument>
16 <classpath>
17 </classpath>
18 <argument>ctas.importer.reader.app.Program</argument>
19 </arguments>
20 </configuration>
21 </plugin>
18行,改成自己的Main-Class类,然后用mvn exec:exec来运行,但是部署到生产环境中时,服务器上通常并不具备maven环境,只能用 java -jar xxx.jar这种方式来运行,下面是一些处理细节:
一、依赖项的处理
java application运行时需要查找依赖的第三方jar,如果查找classpath失败,就会报错,可以先用
mvn dependency:copy-dependencies -DoutputDirectory=target/lib
命令,把依赖的jar包全部导出到target/lib这个目录下
二、利用maven-jar-plugin修改META-INF\MANIFEST.MF 清单文件
java application的最终jar里,用解压工具打开后,可以看到META-INF目录下,有一个重要的清单文件 MANIFEST.MF,这里面可以指定 Main-Class及classpath,结构如下:
1 Manifest-Version: 1.0
2 Built-By: jimmy
3 Build-Jdk: 1.7.0_09
4 Class-Path: lib/DataEntity-1.0.jar ...
5 Created-By: Apache Maven 3.2.3
6 Main-Class: ctas.importer.reader.app.Program
7 Archiver-Version: Plexus Archiver
其中第4行指定了classpath,也就是所依赖的jar包在什么地方,第6行表示main函数的入口类,默认情况下mvn clean package生成的jar包里,清单文件上并没有这2行,需要在pom.xml中添加插件
1 <plugin>
2 <groupId>org.apache.maven.plugins</groupId>
3 <artifactId>maven-jar-plugin</artifactId>
4 <configuration>
5 <archive>
6 <manifest>
7 <mainClass>ctas.importer.reader.app.Program</mainClass>
8 <addClasspath>true</addClasspath>
9 <classpathPrefix>lib/</classpathPrefix>
10 </manifest>
11 </archive>
12 <classesDirectory>
13 </classesDirectory>
14 </configuration>
15 </plugin>
第7行指定Main-Class,第9行指定classpath的相对路径,这样mvn package后,清单文件里就会自动添加Main-Class和Class-Path这二项
ok了,部署时把jar包和lib目录,都上传到服务器上 ,然后测试一下,顺利的话 java -jar xxx.jar就可以了,如果要在后台运行,前面加 nohup