Maven 技术集合-持续更新

文章目录

Process terminated

Idea install 后只展示 Process terminated
其实此时是有提示信息的,但是被隐藏了,查看报错信息的方法是在 console 不断点击 ctrl+A

pom.xml 有一道横线

当idea中的maven项目里,pom.xml被划上一条横线时,所有的类都没法正确导入。解决方法为file->settings->Build,Excution,Deployment->Maven->Ignore file,然后在被打上钩的pom.xml前面的钩去掉,确定后再看项目中的pom.xml即能正确运行。

为啥会出现?删除 项目.iml 文件可以重命名项目,也会导致这个问题

spring-boot-maven-plugin 报错

选择和parent一样的版本即可

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.6.RELEASE</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
maven-resources-plugin 报错

https://developer.aliyun.com/mvn/guide
指定下版本就好

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <delimiters>
                        <delimit>$</delimit>
                    </delimiters>
                </configuration>
            </plugin>
        </plugins>
package 免测试 maven-surefire-plugin
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.19</version>
        </dependency>
    </dependencies>
    <configuration>
        <skipTests>true</skipTests>
    </configuration>
</plugin>
Lombok 插件 和 maven 依赖

IDE 安装 Lombok 插件,然后增加相应依赖,实体类就可以使用 @Setter,@Builder 等注解了。
如果是 SpringBoot项目无需指定 version

<!-- Lombok 插件-需IDE 安装 Lombok 插件配合使用 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>
google guava 工具包 maven 依赖

google guava 工具包,google 封装的 Java 的工具包。

 <!-- google guava 工具包-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
-U -e
  • 使用-U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
  • 使用-e参数:如果构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因。
Maven junit Test < scope>无效

问题描述:使用Junit 依赖,在 src/test/java中无法使用 @Test注解,最后发现是 junit版本太低导致的

  • 出问题的版本
 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
 </dependency>
  • 正常的版本
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>
排除所有间接依赖
<exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>

完整的版本

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
项目缺少 src/main/java 等基础结构

项目右键->buildPath configure Build Path->点击选项卡Libraries->选中JRE System Library-> 点击edit->选中Alternate JRE->选择jdk 点击finish,点击ok,自动出现src/main/java和src/test/java
在这里插入图片描述

错误: 编码GBK的不可映射字符

采取两个措施,一是指定一下Maven编译字符编码,二是对于依旧报错的文件,采取从新创建,将正确内容提前复制出来,再保存的方法.

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>GBK</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
Maven 中的包冲突

JVM 按照 包路径+类名+版本号(不指定就自动生成,各JDK对同一个类自动生成的是一样的) 识别唯一一个类
第一种是同一个jar包,版本不同,引起部分方法不存在-找错jar包类
第二种是,不同jar,但是类被JVM 识别为同一个类,造成包冲突

···/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.3/log4j-slf4j-impl-2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class
 
···/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class

在这里插入图片描述

Maven 依赖顺序

只有对于同一个版本的某jar包本规则才适用,两个不同版本的包会被认为是不同的包,都会被传递依赖

1.间接依赖路径最短优先
一个项目test依赖了a和b两个jar包。其中a-b-c1.0 , d-e-f-c1.1 。由于c1.0路径最短,所以项目test最后使用的是c1.0。

2.pom文件中申明顺序优先
有人就问了如果 a-b-c1.0 , d-e-c1.1 这样路径都一样怎么办?其实maven的作者也没那么傻,会以在pom文件中申明的顺序那选,如果pom文件中先申明了d再申明了a,test项目最后依赖的会是c1.1

所以maven依赖原则总结起来就两条:路径最短,申明顺序其次。
在遇到jar冲突时,最简单的方法是将你需要的放到前面声明

Maven 依赖树
dependency:tree
删除 war 包 里指定 jar包
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-war-plugin</artifactId>
     <configuration>
         <warName>ymf-upgrade-hessian</warName>
         <packagingExcludes>
             WEB-INF/lib/aaa.jar,WEB-INF/lib/bbb.jar
         </packagingExcludes>
     </configuration>
 </plugin>
远程仓库直接配置为阿里云-提升访问速度

阿里云仓库提速

maven自定义war包名和打包路径-不设置就是项目名,默认路径位于target路径下

方法一和方法二可以同时配置,如果同时配置会生成两个war包,而且使用方法二生成的war包要小一些,建议只配置方法二

  • 方法一
<build>
		<finalName>自定义名字1</finalName>
</build>
  • 方法二
<build>
		<plugins>	
			<plugin>  
               <groupId>org.apache.maven.plugins</groupId>  
               <artifactId>maven-war-plugin</artifactId>  
               <version>2.1.1</version>  
               <configuration>  
               		<!-- war包生成路径不是修改的,这里注释掉 -->
                   <!-- <webResources>  
                       <resource>  
                           this is relative to the pom.xml directory  
                           <directory>src/main/webapp</directory>  
                       </resource>  
                   </webResources>   -->
               <warName>自定义名字</warName>  
               </configuration>  
           </plugin>
		</plugins>
	</build>

maven 中配置 tomcat 插件

mvn tomcat:run

<build>    
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat6-maven-plugin</artifactId>
          <version>2.2</version>
        </plugin>
       <!-- 启动使用tomcat7:run  指定端口,项目名称,编码格式,服务器版本 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<!-- 通过jetty访问项目时的项目名称 ${project.build.outputDirectory} 为war包名 -->
	    			<webApp>
						<contextPath>${project.build.outputDirectory}</contextPath>
					</webApp>
					<!-- 设置端口 -->
	    			<port>8086</port>
	    			<!-- 设置编码格式 -->
	    			<uriEncoding>UTF-8</uriEncoding>
	  				<!-- 设置服务器版本 -->
	  				<server>tomcat7</server>
    			</configuration>
				
			</plugin>
      </plugins>
    </build>
  • settings.xml
<pluginGroups>
    <pluginGroup>org.apache.tomcat.maven</pluginGroup>
  </pluginGroups>

此外需要注意的是,tomcat 插件自带了servlet-api。所以需要处理一下servlet-api的作用范围为编译期,运行期使用tomcat自带的jar即可,否则会造成 jar 包冲突

<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<!-- tomcat的话只在编译时和测试时运行,本文jetty插件则注释掉 -->
			<scope>provided</scope>
		</dependency>
maven 中配置 jetty 插件

mvn jetty:run

  • pom.xml
<build>    
        <!-- jar包名称 -->    
        <finalName>springmvc</finalName>    
    
        <plugins>    
            <!-- 编译jdk版本设置 1.6 -->    
            <plugin>    
                <groupId>org.apache.maven.plugins</groupId>    
                <artifactId>maven-compiler-plugin</artifactId>    
                <version>2.3.2</version>    
                <configuration>    
                    <source>1.6</source>    
                    <target>1.6</target>    
                    <uriEncoding>${project.build.sourceEncoding}</uriEncoding>    
                </configuration>    
            </plugin>    
    
            <!-- jetty插件 -->    
            <!-- 在settings.xml 文件中新增 <pluginGroup>org.mortbay.jetty</pluginGroup>      
            <pluginGroups>  
            <pluginGroup  
                 | Specifies a further group identifier to use for plugin lookup.  
                <pluginGroup>com.your.plugins</pluginGroup>  
                <pluginGroup>org.mortbay.jetty</pluginGroup>      
            </pluginGroups>  
          -->  
            <plugin>    
                <groupId>org.mortbay.jetty</groupId>    
                <artifactId>maven-jetty-plugin</artifactId>    
                <version>6.1.26</version>    
                <configuration>    
                    <!-- 通过jetty访问项目时的项目名称 ${project.build.outputDirectory} 为war包名 -->    
                    <webApp>    
                        <contextPath>${project.build.outputDirectory}</contextPath>    
                    </webApp>    
                    <!-- jetty附属配置,未启用 -->    
                    <!-- <webDefaultXml>src/main/resources/webdefault.xml</webDefaultXml> -->    
                    <!-- configuration.scanIntervalSeconds 配置表示新代码的扫描时间间隔(秒),值 <= 0 表示不扫描 -->    
                    <scanIntervalSeconds>0</scanIntervalSeconds>    
                    <!-- 端口设置 -->    
                    <connectors>    
                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">    
                            <port>8085</port>    
                        </connector>    
                    </connectors>    
                </configuration>    
            </plugin>    
    
        </plugins>    
    </build>   
  • settings.xml
<pluginGroups>  
<pluginGroup>org.mortbay.jetty</pluginGroup>  
</pluginGroups>  
eclipse 配置 Maven 插件

http://jingyan.baidu.com/article/5d368d1e306a913f61c05743.html

maven 聚合和继承的关系-既可以相互独立又可以结合使用

maven 聚合是对于父模块而言的,包含子模块,集中编译打包等;maven 继承是对于子模块而言的,子模块继承父模块的 pom,集中依赖版本。二者不是强联系,即父模块不知谁继承了它,子模块不知谁聚合了它。

dependencies与dependencyManagement的区别

父级pom.xml,< packaging>pom< /packaging>
使用< dependencyManagement>,设定依赖以及依赖版本号,其在< dependencies></ dependencies>的外围。
子项目< parent></ parent>继承父项目的pom.xml,需要写出自己的依赖,但是不用写明依赖版本号了。
只使用dependencies的话,即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
参考:http://blog.csdn.net/liutengteng130/article/details/46991829

<dependencyManagement>
		<dependencies>
			<dependency>
			//···
			</dependency>
		</dependencies>
</dependencyManagement>
依赖传递-可选依赖 optional

项目B 依赖 项目A
项目C依赖项目B
常规来说,项目C依赖于项目A
但是如果项目C不需要项目A,则可以在项目B中对A的依赖配置中增加

< optional >true < / optional ><!-- 传递依赖-true 
依赖本项目的项目需要重新配置本项目的依赖 -->

完整的依赖配置举例

 <dependency>
     	<groupId>groupname</groupId>
     	<artifactId>artifactIdname</artifactId>
     	<version>version</version>
     	<optional>true</optional><!-- true,可选依赖,一下本项目的项目如有需要需从新引入本依赖 -->
     </dependency>
Maven build\clean\generate-sources\install

Maven build是这个插件让你自己去配置执行目标的。
Maven clean 清除上一次Maven执行的结果
Maven generate-sources会根据pom配置去生成源代码格式的包
Maven install将项目输出构件部署到本地仓

多版本控制深入(一):profile 和 资源过滤 实现多环境数据库配置-不同环境取不同Maven 常量

本文配置的常量如果用于组成文件名,就可以动态加载不同文件了

正常来说,我们一般需要jdbc.properties 文件

#jdbc settings
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=root

Spring 中配置加载 常量文件
如果使用Maven 环境配置选择文件可以一个配置环境一个文件,比如dev_jdbc.properties,product_jdbc.properties,然后文件加载时写为 ${maven 常量名}_jdbc.properties

 <!-- 定义受环境影响易变的变量 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
		<property name="ignoreResourceNotFound" value="true" />
		<property name="locations">
			<list>
				<!-- 数据库常量配置 -->
				<value>classpath:config/jdbc.properties</value>
			</list>
		</property>
	</bean>

如果我们采取Maven 的多版本配置,比如测试环境、生产环境和开发环境使用的数据库是不一样的
变化在于: jdbc.properties 的取值从 Maven 的 pom.xml 中获取(${maven.jdbc.driverClassName}从那里来?别着急)

  • Maven的pom.xml 内容
<!-- 多版本控制 -->
   <profiles>
   
    <!-- 开发环境 profile  -->
   	<profile>
   		<id>dev</id>
   		<properties>
   			<!-- 数据库配置 -->
	<maven.jdbc.driverClassName>com.mysql.jdbc.Driver</maven.jdbc.driverClassName>
			<maven.jdbc.url>jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false</maven.jdbc.url>
			<maven.jdbc.username>root1</maven.jdbc.username>
			<maven.jdbc.password>root2</maven.jdbc.password>
   		</properties>
   	</profile>
   	
   	<!-- 测试环境 profile  -->
   	<profile>
   		<id>test</id>
   		<properties>
   			<!-- 数据库配置 -->
			<maven.jdbc.driverClassName>com.mysql.jdbc.Driver</maven.jdbc.driverClassName>
			<maven.jdbc.url>jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false</maven.jdbc.url>
			<maven.jdbc.username>root</maven.jdbc.username>
			<maven.jdbc.password>root</maven.jdbc.password>
   		</properties>
   	</profile>
   </profiles>

激活(采用某一种配置)方式有多种,这里选择默认激活方式,仅一个配置可被激活,如下的,如果不写这个,那么比如想激活下面 id=test的配置,怎 运行 clean install -Ptest即可

<!-- profile 多版本定义 -->
   <profiles>
   	<profile>
   		<id>test</id>
   		<activation>
   			<activeByDefault>false</activeByDefault><!-- 默认激活 false 否 -->
   		</activation>
   		<build>  
        	<finalName>test</finalName><!-- 打包名字 -->
		</build>  
   	</profile>
   	<profile>
   		<id>dev</id>
   		<activation>
   			<activeByDefault>true</activeByDefault><!-- 默认激活 true 是-->
   		</activation>
   		<build>
   			<finalName>dev</finalName><!-- 打包名字 -->
   		</build>
   	</profile>
   </profiles>

这样就结束了吗?因为我们在Maven中配置的常量并不能直接用于Java项目中解析,所以需要开启资源过滤设置

虽然默认的Maven资源是 src/main/resources和src/test/resources 但是依旧需要设置一下,当然,多设置也是可以的,比如你有src/dev/resources
可以存在于中,而放置放到 中,也可以放到中,作用访问不同,一般用区分范围,就放到中

<build>  
    <!-- 开启资源过滤-正式 -->
    <resources>
    	<resource>
    		<directory>${project.basedir}/src/main/resources</directory>
    		<filtering>true</filtering>
    	</resource>
    </resources>
    <!-- 测试 -->
    <testResources>
    	<testResource>
    		<directory>${project.basedir}/src/test/resources</directory>
    		<filtering>true</filtering>
    	</testResource>
    </testResources>
  </build>

最后需要注意的是
第一:配置版本的常量名字不能和jdbc.properties 的名字一样,即jdbc.properties的key和 pom.xml的properties的值不能一样,jdbc.properties 修改为 jdbc.password=${maven.jdbc.password},即 Spring 配置文件可以从 Maven 取值
第二:更换profile的内容需要clean项目,否则新配置不会自动生效

这里运行之后,可以去除配置文件了 直接使用 ${maven.jdbc.password} 就可以获取Maven 中配置的常量值。

多版本控制深入(二):profile 和 资源过滤 实现多环境数据库配置-采取资源过滤,直接指定要使用的文件

阅读这段的时候,请先阅读本文的 多版本控制深入:profile 和 资源过滤 实现多环境数据库配置-不同环境取不同Maven 常量 ,对比学习,二者不同之处在于,前者指定了常量,不同环境常量不同,本文采取了另一种思路,不同环境运行不同的配置文件,大同小异的地方是都需要 配置,不同的地方是新增了一个

多版本控制深入(三):不将非本版本文件编译、打包

多本版情况下,其他 profile 的配置文件对本版本是多余的,在打包和编译的时候应该排除,方法如下,当然有排除就有添加,下面是举例

<resources>
	<resource>
		<!-- 配置Maven 管理的目录,可以配置多个 ,这里是指可以使用Maven常量配置的目录-->
		<directory>${basedir}/src/main/resources</directory>
		<!-- 配置是否生效 -->
		<filtering>true</filtering>
		<!-- 文件过滤:包含 -->
		<includes>
			<include>**/**.*</include>
			<include>**/dev_jdbc.properties</include>
		</includes>
		<!-- 文件过滤:不包含 -->
		<excludes>
			<exclude>**/product*.*</exclude>
		</excludes>
	</resource>
</resources>
多版本控制深入(四):直接使用 Maven 加载配置文件

上面的几个例子说明了Maven 配置常量然后将常量直接给Spring 使用,或者常量指定文件名来使用,本例是直接使用Maven 加载配置文件,位于中

<build>
<filters
<filter>${basedir}/src/main/resources/config/dev_jdbc.properties</filter>
</filters>
</build>
Maven 生成站点信息
<!-- 生成项目站点 运行 mvn:site-->
	<dependency>
	    <groupId>org.apache.maven.plugins</groupId>
	    <artifactId>maven-site-plugin</artifactId>
	    <version>3.0-beta-1</version>
	</dependency>

运行 mvn:site,即可在 target 目录下看到相关文件

  • 如果你想看到生成中文文档
<build>
  	<plugins>	
  		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
		    <artifactId>maven-site-plugin</artifactId>
		    <configuration>
		    	<locales>zh_CN</locales>
		    </configuration>    
  		</plugin>
  	</plugins>  
  </build>  
Maven 指定测试目录
<!-- junit仅测试环境使用     -->
     <dependency>    
         <groupId>junit</groupId>    
         <artifactId>junit</artifactId>    
         <version>4.12</version>    
         <scope>test</scope>    
     </dependency>  

 <!-- 测试插件 -->
         <plugin>
         	<groupId>org.apache.maven.plugins</groupId>
         	<artifactId>maven-surefire-plugin</artifactId>
         	<version>2.5</version>
         	<configuration>
         		<skipTests>false</skipTests><!-- 跳过测试 true-是,false-否 -->
         		<test>com.bestcxx.stu.springmybatis.service.*,com.bestcxx.stu.springmybatis.dao.*</test><!-- 指定包路径进行测试 -->
         	</configuration>
         </plugin>

  • 运行命令

mvn:test

学Maven 不可不知的网站-获取依赖

http://mvnrepository.com/search?q=slf4j-log4j12

aspectj Maven 依赖
 <dependency>  
	      <groupId>org.aspectj</groupId>  
	      <artifactId>aspectjrt</artifactId>  
	      <version>1.8.9</version>  
	    </dependency>  
	    <dependency>  
	      <groupId>org.aspectj</groupId>  
	      <artifactId>aspectjtools</artifactId>  
	      <version>1.8.9</version>  
	    </dependency>  
	    <dependency>  
	      <groupId>org.aspectj</groupId>  
	      <artifactId>aspectjweaver</artifactId>  
	      <version>1.7.4</version>  
	    </dependency>  

scope=“system”,将指定目录jar包通过maven 形成依赖
<dependency>
			<systemPath>本地路径.jar</systemPath>
			<groupId>***</groupId>
			<artifactId>***</artifactId>
			<version>***</version>
			<scope>system</scope>
		</dependency>

运行跳过测试 -DskipTests 或者 -Dmaven.test.skip=true

-DskipTests
-Dmaven.test.skip=true

-DskipTests ,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
-Dmaven.test.skip=true ,不执行测试用例,也不编译测试用例类。

将本地项目上产私服 clean install deploy

clean install deploy

  • 如果系统还没有代码,此时打包会报错
    You have to use a classifier to attach supplemental artifacts to the project instead of replacing them.
指定jdk版本

比如你之前依赖一个jar是jdk1.7编译的,然后有一天换成1.8编译了,但是jar包 version 没有变化,这个以后你用不着更新你自己项目环境的jdk,只需要在你依赖的jar的依赖中添加 jdk17

 <dependency>
            <groupId>***</groupId>
            <artifactId>***</artifactId>
            <version>***</version>
            <classifier>jdk17</classifier>
        </dependency>	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值