Maven引入本地jar包並生成jar包運行修改MANIFEST.MF文件

由於項目需要發送短信的功能,確定了產品後,開始開發,發現第三方提供的jar沒有maven座標。於是就開啓了一系列的坑爹之路,最後還是解決了,紀錄下。

先大致介紹下項目環境,以便能夠更好的理解。 首先項目是分多模塊的,3個jar包,1個war包。其中2個jar包是任務運行,批處理,監控等,發短信的功能就在其中一個jar中完成。還有個jar是core包,一些通用的公用的類,配置文件,services服務等。war包就是個服務接口,利用SpringMVC完成。

以下所有的修改都在一個任務jar中。

從第三方下載的jar複製到src/main/resources/lib目錄下(新建lib目錄),

引用方式:

<dependency>
	<groupId>SMS_SDK_JAVA</groupId>
	<artifactId>SMS_SDK_JAVA</artifactId>
	<version>v2.6.3r</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/src/main/resources/lib/SMS_SDK_JAVA_v2.6.3r.jar</systemPath>
</dependency>

這裏的scope只能是system範圍,systemPath屬性指定jar的路徑。

看下原本的打包方式:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>2.3.2</version>
	<configuration>
		<archive>
			<manifest>
				<-- 在jar包的MF文件中生成Class-Path屬性 -->
				<addClasspath>true</addClasspath>
				<-- Class-Path 前綴 -->
				<classpathPrefix>lib/</classpathPrefix>
				<-- main全限定包名 -->
				<mainClass>xxx.MainTask</mainClass>
			</manifest>
		</archive>
	</configuration>
</plugin>

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>2.3</version>
	<configuration>
		<descriptors>
			<descriptor>src/main/resources/assembly.xml</descriptor>
		</descriptors>
	</configuration>
	<executions>
		<execution>
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>

assembly.xml就不貼出來了,主要工作就是打tar.gz包。 打出來的jar包中,並不包含system範圍的jar包,就是第三方的包。並且在jar包的MF文件的classpath也未找到第三方的lib路徑。

最後修改如下:

<configuration>
	<archive>
		<manifest>
			<addClasspath>true</addClasspath>
			<classpathPrefix>lib/</classpathPrefix>
			<mainClass>com.madhouse.platform.maddsp.task.MainTask</mainClass>
		</manifest>
		<-- 添加classpath缺少的內容-->
		<manifestEntries>
			<Class-Path>lib/SMS_SDK_JAVA_v2.6.3r.jar</Class-Path>
		</manifestEntries>
	</archive>
</configuration>

這樣第三方的jar包就包含在classpath中,運行的java -jar xxx.jar的時候,也就不會報NoClassFound錯誤了。

完整的MF內容如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: zhujiajun
Build-Jdk: 1.7.0_72
Main-Class: xxx.MainTask
Class-Path: lib/SMS_SDK_JAVA_v2.6.3r.jar lib/org.apache.oltu.oauth2.resourceserver-1.0.0.jar l
 ib/org.apache.oltu.oauth2.common-1.0.0.jar lib/json-20131018.jar lib/
 org.apache.oltu.oauth2.resourceserver-filter-1.0.0.jar lib/org.apache
 .oltu.oauth2.client-1.0.0.jar lib/druid-1.0.14.jar lib/ehcache-core-2
 .6.10.jar lib/spring-websocket-4.1.2.RELEASE.jar lib/spring-core-4.1.
 2.RELEASE.jar lib/spring-messaging-4.1.2.RELEASE.jar lib/spring-beans
 -4.1.2.RELEASE.jar lib/mail-1.4.4.jar lib/activation-1.1.jar lib/slf4
 j-api-1.7.5.jar lib/logback-classic-1.0.11.jar lib/logback-core-1.0.1
 1.jar lib/poi-3.11.jar lib/commons-codec-1.9.jar lib/poi-ooxml-3.11.j
 ar lib/poi-ooxml-schemas-3.11.jar lib/xmlbeans-2.6.0.jar lib/stax-api
 -1.0.1.jar lib/junit-4.10.jar lib/hamcrest-core-1.1.jar lib/spring-te
 st-4.1.2.RELEASE.jar lib/fastjson-1.1.37.jar lib/commons-fileupload-1
 .3.1.jar lib/commons-io-2.2.jar lib/httpmime-4.3.5.jar lib/httpclient
 -4.3.5.jar lib/httpcore-4.3.2.jar lib/commons-logging-1.1.3.jar lib/j
 stl-1.2.jar lib/jedis-2.6.0.jar lib/commons-pool2-2.0.jar lib/mybatis
 -3.2.8.jar lib/mybatis-spring-1.2.2.jar lib/mysql-connector-java-5.1.
 31.jar lib/spring-web-4.1.2.RELEASE.jar lib/spring-aop-4.1.2.RELEASE.
 jar lib/aopalliance-1.0.jar lib/spring-webmvc-4.1.2.RELEASE.jar lib/s
 pring-expression-4.1.2.RELEASE.jar lib/spring-context-4.1.2.RELEASE.j
 ar lib/spring-context-support-4.1.2.RELEASE.jar lib/spring-jdbc-4.1.2
 .RELEASE.jar lib/spring-aspects-4.1.2.RELEASE.jar lib/aspectjweaver-1
 .8.3.jar lib/spring-tx-4.1.2.RELEASE.jar lib/spring-data-redis-1.4.2.
 RELEASE.jar

另外如果有需要可以定製MF文件,參考 Apache Maven manifestEntries官網說明和 IBM Apache Maven您不知道的5件事


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章