Maven - Jar

来源:互联网 发布:通讯软件 英语 编辑:程序博客网 时间:2024/05/23 05:07



<build><finalName>SmsTask</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java-version}</source><target>${java-version}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><!--<createSourcesJar>true</createSourcesJar> --><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>RunTaskAPP</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions></plugin></plugins></build>



我在工程中依赖了spring框架的jar包,我打包成功后使用命令来调用jar包时报错

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.  

简单来说就是spring在启动时会加载xsd文件,它首先会到本地查找xsd文件(一般都会包含在spring的jar包中),如果找不到则会到xml头部定义的url指定路径下中去寻找xsd,如果找不到则会报错。附:在spring jar包下的META-INF文件夹中都会包含一个spring.schemas文件,其中就包含了对xsd文件的路径定义

原因是在打包的时候 META-INF/spring.schemas 文件中少了spring 一些组件的xsd定义

所以一般推荐使用另外的一个插件来进行打包,插件名称为:maven-shade-plugin,shade插件打包时在对spring.schemas文件处理上,它能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合,要使用shade插件,必须在pom进行如下配置:

<transformer      implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">      <resource>META-INF/spring.handlers</resource>  </transformer>  <transformer     implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">     <resource>META-INF/spring.schemas</resource> </transformer>


上面这段配置意思是把spring.handlers和spring.schemas文件以append方式加入到构建的jar包中,这样就不会出现xsd找不到的情况。配置完pom后,调用mvn clean install命令进行构建,构建成功后打开工程target目录,发现生成了2个jar包,一个为:original-XXX-0.0.1-SNAPSHOT.jar,另一个为:XXX-0.0.1-SNAPSHOT.jar。其中original...jar里只包含了工程自己的class文件,而另外的一个jar包则包含了工程本身以及所有依赖的jar包的class文件。我们只需要使用第二个jar包就可以了。


到target文件夹下 cd D:\Workspaces\WLAN_JT\smsTask\target  java -jar SmsTask.jar<pre name="code" class="html"><strong>在linux下 指定jre 运行jar</strong>
nohup /cleanfile/jre1.6.0_11/bin/java -jar -Dapp.logpath=logs/ RunTask.jar weakPwdSMSJob & 


或者

修改original-SmsTask\META-INF 下的MANIFEST.MF 手动添加依赖包 和配置文件。

Main-Class: com.ffcs.sms.util.RunTaskClass-Path: conf/ lib/commons-logging-1.1.1.jar lib/ojdbc14.jar lib/sm sp.jar lib/spring.jar lib/xercesImpl.jar lib/log4j-1.2.8.jar

第一种方式就是所有东西全在一个包里

第二种 把第三方包分离出来 方便配置


MANIFEST.MF

Manifest-Version: 1.0Build-Jdk: 1.6.0_13Built-By: hugshCreated-By: Apache Maven 3.1.1Main-Class: RunTaskAPPClass-Path: conf/Archiver-Version: Plexus Archiver

Class-Path :conf 可以指定配置文件相对于jar包的位置(这样修改配置文件就很简单,不需要在jar包中修改了)



0 0