maven
Maven中dependencyManagement的作用
1.在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器。
2.pom.xml文件中,jar的版本判断的三种途径
1:如果dependencies里的dependency自己没有声明version元素,那么maven就先根据parent以来的版本确定,也没有再去dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它,如果
没有就会报错,告诉你必须为dependency声明一个version
如下
pom.xml //只是对版本进行管理,不会实际引入jar <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.7</version> </dependency> </dependencies> </dependencyManagement> //会实际下载jar包 <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> </dependencies>
dependency中scope的作用
https://blog.csdn.net/pengpengzhou/article/details/81743567
https://blog.csdn.net/xiao__gui/article/details/47341385
https://www.jianshu.com/p/d44f713b1ec9
官方
http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html
http://maven.apache.org/shared/maven-archiver/index.html
maven常用的scope有compile,provided,runtime,test。
- complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。
- test表示只在test阶段有依赖关系,例如junit,如果是封装SDK,日志的具体实现需要由调用者指定,但是又想要在自动化测试中输出日志,就可以将日志的依赖包的scope设为test,但是slf4j-api的scope还是要设置成compile,否则会编译失败。
- provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供
- runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池,具体的log包,因为编译时使用的是slf4j的接口,并没有直接调用日志实现类。
编译插件
一般只需要添加如下配置就行
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
但是有时发布环境并没有安装maven,需要将依赖的jar包一起打包进去,这个时候上面的打包方式就不行了,因为并没有将依赖包打包到jar里面。
一种方式可以打成war包,但不推荐使用。
https://www.cnblogs.com/gugia/p/10859497.html
首先需要找出所有的依赖包,执行下面的命令,可以将依赖jar包放到指定的目录中
mvn dependency:copy-dependencies -DoutputDirectory=lib
然后在pom文件中指定刚才生成的本地依赖包的路径,以及自动生成个依赖jar包的相对引用路径,并且还要指定主类,否则使用java -jar命令运行会出现“提示没有主清单属性”的错误
完整配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <!-- 告知 maven-jar-plugin添加一个 Class-Path元素到 MANIFEST.MF文件,以及在Class-Path元素中包括所有依赖项 --> <addClasspath>true</addClasspath> <!-- 所有的依赖项应该位于 lib文件夹 --> <classpathPrefix>lib/</classpathPrefix> <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 --> <mainClass>com.cmbchina.csv.to.es.App</mainClass> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> </archive> </configuration> </plugin>
其他常用的打包依赖jar包方式介绍
https://www.cnblogs.com/yelao/p/11675923.html
maven依赖jar包时版本冲突的解决
https://blog.csdn.net/sinat_39789638/article/details/78005945
共有四种解决方式:
1、第一声明优先原则:
在pom.xml配置文件中,如果有两个名称相同版本不同的依赖声明,那么先写的会生效。
所以,先声明自己要用的版本的jar包即可。
2、路径近者优先:
直接依赖优先于传递依赖,如果传递依赖的jar包版本冲突了,那么可以自己声明一个指定版本的依赖jar,即可解决冲突。
3、排出原则:
传递依赖冲突时,可以在不需要的jar的传递依赖中声明排除,从而解决冲突。
例子:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
4、版本锁定原则(最常使用)
在配置文件pom.xml中先声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。解决了依赖冲突。
例子:
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>