Maven - Jar

本文介绍了解决Spring框架在启动过程中因无法找到XSD文件而导致的问题。通过配置maven-shade-plugin插件,实现对spring.schemas文件的合并处理,确保单一jar包内包含了所有依赖的版本集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



<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>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<mainClass>RunTaskAPP</mainClass>
								</transformer>

								<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>

							</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.RunTask
Class-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.0
Build-Jdk: 1.6.0_13
Built-By: hugsh
Created-By: Apache Maven 3.1.1
Main-Class: RunTaskAPP
Class-Path: conf/
Archiver-Version: Plexus Archiver

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值