在项目开发过程中,难免遇到需要引用私有jar的情况,这时候最好是将该jar推送到私服仓库,但是由于种种 “现实问题” ,比如权限不够、时间不够等等。
于是就可以尝试将jar放入项目中进行集成,此时需要面临的就是该jar生命周期的问题。
一、Scope属性
<dependency>
<groupId>com.medex</groupId>
<artifactId>WebsocketClient-aoa</artifactId>
<version>2.2.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/WebsocketClient-aoa-2.2.1.jar</systemPath>
</dependency>
首先在pom文件中将依赖换成读取本地:<systemPath>
然后通过<scope>标签控制该jar包(依赖)的生存周期:
1.compile
编译范围,默认scope,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。
2.provided
容器或JDK已提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中。最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
3.runtime
一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。
4.test
测试范围,一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等。
5.system
系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath指定本地jar文件路径。
二、打包扫描
所以此时我们需要设置为system方式,但是在部署到服务器时又会有别的问题。
此时部署到容器运行时,就会提示找不到类,因为该jar未被注入到项目lib中,需要在pom文件中增加打包扫描的配置。
1、项目打的是jar包,需要如下配置:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
2、项目打的是war包,需要如下配置:
按照上述,即使配置了<includeSystemScope>true</includeSystemScope>,打war包不会将本地jar包打入\WEB-INF\lib 下,而是在 \WEB-INF\lib-provided 下。需要在 <build> <plugins> 下添加或修改maven-war-plugin配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<!-- 存放本地jar的文件夹 src/main/resources/lib -->
<directory>${project.basedir}/src/main/resources/lib</directory>
<!-- 目标lib目录 WEB-INF/lib/ -->
<targetPath>WEB-INF/lib/</targetPath>
<includes>
<!-- 匹配所有jar包 -->
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)