Maven 基础、JAR包说明

下载 安装
Maven安装配置 https://blog.csdn.net/m0_63684495/article/details/129046405

官网 https://maven.apache.org/download.cgi
下载 https://archive.apache.org/dist/maven/maven-3/
Maven-3.9.6下载 https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip
Maven-3.8.1下载 https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
maven版本查询 https://mvnrepository.com/


springboot 打包插件spring-boot-maven-plugin打包机制及内部结构分析
https://blog.csdn.net/iss_jin/article/details/122463390


Maven 打 Jar 包体积缩小100倍 https://mp.weixin.qq.com/s/qniPev0onMfmPzxigB5MaA

多个子module项目相互依赖,提示程序包不存在  https://blog.csdn.net/qq_60390518/article/details/131432348

IDEA创建Maven工程;部署Web项目运行到tomcat下
<targetPath> 是指将文件输出到的位置(默认target/classes目录)
<directory> 是指将指定的目录打包
<includes><directory>这个目录中指定包含哪些文件进行打包
<exclude><directory>这个目录中指定排除哪些文件(打包不加入)
<filtering> 结合<filters>指定过滤替换
${project.build.directory} 指构建目录,即target目录
${basedir} 项目的根目录

dependenceManagement

Maven的dependencyManagement是一种机制,允许你在父POM(Project Object Model)中定义依赖的版本和配置,而不实际引入这些依赖。子项目可以选择性地继承这些依赖,并使用父POM中定义的版本和配置。通过这种方式,你可以统一管理项目中所有模块的依赖版本,避免版本冲突和不一致。
https://blog.csdn.net/xycxycooo/article/details/141220290

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。
runtime ??

Maven打包

Maven构建分布式项目时子模块相互依赖打包技巧

<build>
    <plugins>
        <!-- 资源文件拷贝插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!-- Java编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!-- maven打包插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
properties

指明JDK版本
在使用 spring-boot-maven-plugin 插件进行打包操作的时候强烈建议指明JDK版本,不然可能在使用了一些Java8新特性的时候可能受到类似不识别Lambda,请使用Resource8这样的错误。

<properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

resources

maven profile <filtering>true</filtering>的作用

        <!-- 定义包含这些资源文件,能在jar包中获取这些文件 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
                <!--是否替换资源中的属性-->
                <filtering>false</filtering>
            </resource>
        </resources>

Maven安装

maven本地部署后,环境变量配置完成后,检验maven的配置是否生效或正确

1.在控制台输入 mvn help:system 系统下载更新包

2.当控制台出现build success时,说明配置生效或正确。这样本地仓库就配置成功了

3.添加阿里云https镜像

	<mirror>
		<id>aliyunmaven</id>
		<mirrorOf>*</mirrorOf>
		<name>阿里云公共仓库</name>
		<url>https://maven.aliyun.com/repository/public</url>
	</mirror>

Maven基础 属性说明

Profiles

mvn package -P dev
https://blog.csdn.net/fox_bert/article/details/85641251
https://segmentfault.com/a/1190000015251264

maven profiles 配置

    <profiles>
        <profile>
            <id>prod</id>
            <properties>
                <env>prod</env>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <env>test</env>
            </properties>
        </profile>
    </profiles>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources/profile/${env}</directory>
            </resource>
        </resources>
    </build>
Properties

Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性;

relativePath
relativePath:
1)指定查找该父项目pom.xml的(相对)路径。默认顺序:relativePath > 本地仓库 > 远程仓库
2)没有relativePath标签等同…/pom.xml, 即默认从当前pom文件的上一级目录找
3)表示不从relativePath找, 直接从本地仓库找,找不到再从远程仓库找

scope

scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。

runtime ??
maven- compiler-plugin

Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

Maven 命令
  • clean 清除编译
  • compile 编译
  • test 编译并测试
  • install 打包并发送到本地仓库
  • package 只是打成jar包,并不会发送到本地仓库
sourceDirectory
<packaging>war</packaging>
<!--项目产生的构件类型,例如jar、war、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->

jar代表生成jar文件,war代表打包的是war文件,意思就是说是一个web程序

<!--项目的名称, Maven产生的文档用 -->
  <name>mypro02 Maven Webapp</name>
<!--项目主页的URL, Maven产生的文档用 -->
  <url>http://maven.apache.org</url>
清除与编译

clean清除编译,compile编译,test编译并测试,install 打包并发送到本地仓库,package 只是打成jar包,并不会发送到本地仓库

webcontent 目录 和 webapp 两个目录什么区别 ?

http://bbs.csdn.net/topics/390686693

因为你新建的时候选择了war,在最后又自己填写了发布路径为webapp作为路径,所以maven根据自己的模板mavne-archetype-webapp生产的工程 所以满足了maven web工程结构要求,自然就不会有了,如果你开始你没有选择mavne-archetype-webapp,而是直接就建立了maven工程那么在转换成web工程时是web插件转化的,所以会出现所谓的webContent,其实这样不符合maven web工作结构,那个可以复制到webapp中然后删除即可。

关于artifact、war、jar、war exploded

https://blog.csdn.net/weixin_45783996/article/details/107967737

intellij中Project Structure中的artifacts到底是什么?
官方定义是这样的:
An artifact is an assembly of your project assets that you put together to test, deploy or distribute your software solution or its part. Examples are a collection of compiled Java classes or a Java application packaged in a Java archive, a Web application as a directory structure or a Web application archive, etc.

翻译过来就是项目资产的组装 ,反正我的理解就是打包方式,像jar、war、war exploded的ar两个字母就是artifact的意思,就是说编译后的Java类,Java应用,Web应用等资源,要用来测试或者部署的时候,该如何打包。某个module有了 Artifacts 就可以部署到应用服务器中了(比如在部署步骤中选择的就是artifacts里面的artifact,当然也可以选择external source)。

jar和war又有什么区别呢?
定义区别:
jar:Java ARchive,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件或库;

war:Web application ARchive,一种JAR文件,其中包含用来分发的JSP、Java Servlet、Java类、XML文件、标签库、静态网页(HTML和相关文件),以及构成Web应用程序的其他资源;

exploded:在这里你可以理解为展开,不压缩的意思。也就是war、jar等产出物没压缩前的目录结构。建议在开发的时候使用这种模式,便于修改了文件的效果立刻显现出来。



问题 项目为什么要使用jar或war进行打包发布?使用场景区别是什么?

问题 为什么javaweb部署到服务器上的url默认为project文件名_war_exploded?
因为intellij默认帮我们设置的artifact是exploded类型的,那么改artifact的name就是project文件名:war exploded,那applicant context(也就是部署的目录,即项目根目录的路径)就默认为project文件名_war_exploded,当然这个可以自由改动。

问题 javaweb中的output path已经设置成了WEN-INF下面的classes文件夹,那么out文件夹到底是用来干嘛的?
用来生成artifact,artifact目录下面默认是只有一个project文件名_war_exploded文件夹的,里面的结构和内容都与web(或者web-content?)文件夹一致。
但是也可以手动生成一个war包,这个网上也有教程,比如这里,然后部署,设置applicant context,然后访问。或者复制到tomcat的webapps文件夹下面,启动电脑上的tomcat服务器来访问。

链接:https://blog.csdn.net/weixin_45783996/article/details/107967737

问题

spring-boot-maven-plugin SpringBoot打jar包

IDEA中创建父子工程与maven打包Springboot聚合工程报错程序包不存在问题处理
https://www.cnblogs.com/adingfirstlove/p/13791549.html

与tomcat

idea开发web项目,路径localhost:8080后去除 项目名+_war_exploded 的方法
https://blog.csdn.net/qq_43588377/article/details/120203952

Could not open ServletContext resource [/WEB-INF/classes/spring/applicationContext.xml]
https://blog.csdn.net/wlwlwlwl015/article/details/48134763

由于在没用Maven之前,我的spring配置文件 applicationContext.xml是放在WEB-INF根目录下的,在项目运行时都是正常的;
重构成Maven项目之后,我的配置文件自然应该放在src下的resources文件夹下了,那么在web.xml中我自然将<init-param>中contextConfigLocation的参数值由WEB-INF/applicationContext.xml修改为classpath:applicationContext.xml了,那么启动tomcat之后依然报错,而且我们从报错信息中可以看出容器依然是在WEB-INF下去找applicationContext.xml,很明显这个文件的位置已经被我们改变了,而且我们也修改了web.xml的配置为何还要从这里去加载呢?原因是我们缺少另一个重要的配置。
遇到问题盲目搜索往往不能迅速得到有效的解决方案,所以我们先从官方去寻找线索,看一看spring的官方文档,在The Web的章节中可以发现这样一段话:
简单翻译一下上图标记的小段落:如果不特意指定参数名为contextConfigLoction的<context-parameter>元素,那么spring的ContextLoderListener监听器就会在/WEB-INF/下去寻找并加载该目录下的名为applicationContext.xml这个文件。So,我们应该在web.xml中添加<context-param>标签并再次指定spring核心文件的位置:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>

maven编译时出现There are test failures
解决方法:这是因为测试代码时遇到错误,它会停止编译。只需要在pom.xml的<project>里添加以下配置,使得测试出错不影响项目的编译。

 <build>
	    <plugins>
	        <plugin>
	            <groupId>org.apache.maven.plugins</groupId>
	            <artifactId>maven-surefire-plugin</artifactId>
	            <configuration>
	                <testFailureIgnore>true</testFailureIgnore>            
	            </configuration>
	        </plugin>
	    </plugins>
	</build
链接:https://blog.csdn.net/u011134399/article/details/79103093
其他

在eclipse jee中创建Maven project并且转换为Dynamic web project
http://www.zuidaima.com/blog/1618162161323008.htm

打包证书DerInputStream.getLength(): lengthTag=111, too big

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <!-- 过滤后缀为pem、pfx的证书文件 -->
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>cer</nonFilteredFileExtension>
                        <nonFilteredFileExtension>pem</nonFilteredFileExtension>
                        <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

参考资料

Maven依赖排除、禁止依赖传递、取消依赖的方法
https://www.cnblogs.com/junzi2099/p/14118936.html

Maven构建分布式项目时子模块相互依赖打包技巧
https://www.cnblogs.com/DJOSIMON/p/14891506.html

maven打包方式(多模块)
https://blog.csdn.net/sinat_28007043/article/details/119020056

关于maven打包时,没有将依赖包打进来的问题
https://blog.csdn.net/vcj1009784814/article/details/122963905

SpringBoot的repackage和Maven打包命令之间的区别
https://www.jdon.com/55548

无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题
https://blog.51cto.com/eguid/2976781

<!--            &lt;!&ndash;打包插件,在Jar包中添加Class-Path和Main-Class&ndash;&gt;-->
<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-jar-plugin</artifactId>-->
<!--                <version>3.0.2</version>-->
<!--                <configuration>-->
<!--                    <archive>-->
<!--                        &lt;!&ndash;使用自己的Manifest文件,运行正常&ndash;&gt;-->
<!--                        &lt;!&ndash;<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>&ndash;&gt;-->
<!--                        &lt;!&ndash;使用插件添加的Manifest文件,运行正常,一定要注意Manifest中jar包名称和lib文件夹下jar包名称版本号后缀等一定要一致,否则找不到依赖jar,此处有坑&ndash;&gt;-->
<!--                        <manifest>-->
<!--                            <addClasspath>true</addClasspath>-->
<!--                            &lt;!&ndash;指定依赖资源路径前缀&ndash;&gt;-->
<!--                            <classpathPrefix>lib/</classpathPrefix>-->
<!--                            <mainClass>cn.codepub.maven.test.Main</mainClass>-->
<!--                        </manifest>-->
<!--                        &lt;!&ndash;可以把依赖本地系统的Jar包加入Manifest文件中&ndash;&gt;-->
<!--                        &lt;!&ndash;<manifestEntries>-->
<!--                            <Class-Path>lib/lucene-1.0.0-SNAPSHORT.jar</Class-Path>-->
<!--                        </manifestEntries>&ndash;&gt;-->
<!--                    </archive>-->
<!--                </configuration>-->
<!--            </plugin>-->

<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--                <version>${spring-boot.version}</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <phase>none</phase>-->
<!--                        <goals>-->
<!--                            <goal>repackage</goal>-->
<!--                            <goal>build-info</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--                <configuration>-->
<!--                    <classifier>exec</classifier>-->
<!--                </configuration>-->
<!--            </plugin>-->

<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-dependency-plugin</artifactId>-->
<!--                <version>3.3.0</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <id>copy-dependencies</id>-->
<!--                        <phase>prepare-package</phase>-->
<!--                        <goals>-->
<!--                            <goal>copy-dependencies</goal>-->
<!--                        </goals>-->
<!--                        <configuration>-->
<!--                            <outputDirectory>${project.build.directory}/lib</outputDirectory>-->
<!--                            <overWriteReleases>false</overWriteReleases>-->
<!--                            <overWriteSnapshots>false</overWriteSnapshots>-->
<!--                            <overWriteIfNewer>true</overWriteIfNewer>-->
<!--                            <excludeTransitive>false</excludeTransitive>-->
<!--                            <stripVersion>false</stripVersion>-->
<!--                        </configuration>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->

Jar包 引用相关

SpringBoot热部署配置

SpringBoot热部署配置 https://blog.csdn.net/key915/article/details/118209823
<build>
     <plugins>
     <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
         <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
         </configuration>
    </plugin>
     </plugins>
</build>

使用spring-boot-configuration-processor生成配置文件说明

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
原理
SpringBoot项目生成的jar包内包含有配置属性详细信息的元数据文件(spring-configuration-metadata.json),这些文件能够为在配置application.yml或者application.properties时提供属性说明、默认值和自动补全。
大多数元数据文件是在编译时通过处理使用@ConfigurationProperties注解注释的类的所有属性自动生成的。与此同时,也可以指定格式手动编写一部分元数据,用于极端情况或者更高级的用法。

a

<!-- Guava:google公司开发的一款Java类库扩展工具包 https://blog.csdn.net/mouday/article/details/128827421 -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0-jre</version>
</dependency>

            <!-- 计算地球上两个经纬度坐标之间的距离-geodesy和geotools实现 -->
            <dependency>
                <groupId>org.gavaghan</groupId>
                <artifactId>geodesy</artifactId>
                <version>1.1.3</version>
            </dependency>

b

一个用于在JSON序列化过程中忽略特定字段的Java库。这个库提供了@JsonIgnore注解,可以标记在类的字段上,以便在序列化为JSON字符串时忽略该字段。
            <dependency>
                <groupId>com.github.rkonovalov</groupId>
                <artifactId>json-ignore</artifactId>
                <version>1.0.8</version>
            </dependency>

            <!--java使用xstream实现xml文件和对象之间的相互转换-->
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.11.1</version>
            </dependency>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>