spring-boot 构建的应用用传统的方式打包会报
???java.lang.NoClassDefFoundError: org/springframework/boot/CommandLineRunner
错误,应该加入spring-boot-maven-plugin .
如下:
? ? <build>
? ? ? ? <plugins>
? ? ? ? ? ? <plugin>
? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>
? ? ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>
? ? ? ? ? ? </plugin>
? ? ? ? ? ? <plugin>
? ? ? ? ? ? ? ? <groupId>org.apache.maven.plugins</groupId>
? ? ? ? ? ? ? ? <artifactId>maven-jar-plugin</artifactId>
? ? ? ? ? ? ? ? <configuration>
? ? ? ? ? ? ? ? ? ? <archive>
? ? ? ? ? ? ? ? ? ? ? ? <manifest>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <mainClass>com.ams.Application</mainClass>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <addClasspath>true</addClasspath>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <classpathPrefix>lib/</classpathPrefix>
? ? ? ? ? ? ? ? ? ? ? ? </manifest>
? ? ? ? ? ? ? ? ? ? </archive>
? ? ? ? ? ? ? ? ? ? <classesDirectory>
? ? ? ? ? ? ? ? ? ? </classesDirectory>
? ? ? ? ? ? ? ? </configuration>
? ? ? ? ? ? </plugin>
? ? ? ? </plugins>
? ? </build>
在pom里面添加后 直接 mvn clean package 就搞定.
?
java -jar u.jar
?
?
如果不是spring-boot 这个也可以用
一、依赖项的处理
?
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中添加插件
?
按 Ctrl+C 复制代码
?
按 Ctrl+C 复制代码
第7行指定Main-Class,第9行指定classpath的相对路径,这样mvn package后,清单文件里就会自动添加Main-Class和Class-Path这二项
?
ok了,部署时把jar包和lib目录,都上传到服务器上 ,然后测试一下,顺利的话 java -jar ?xxx.jar就可以了
原文:http://luyuwww.iteye.com/blog/2226884