maven笔记

文章介绍了如何使用Maven解决jar冲突,包括排除依赖和设置optional或provided作用域。还详细讲解了Maven的生命周期,如clean、compile、test等阶段,以及聚合项目和继承的概念。此外,提到了Maven项目公共属性的定义和普通Maven项目打jar包的方法,包括创建可执行jar和打包成exe的策略。
摘要由CSDN通过智能技术生成

maven笔记

maven解决jar冲突的办法

排除A.jar中依赖的B.jar

<dependency>
    <groupId>xxx.xxx</groupId>
    <artifactId>jarA</artifactId>
    <version>0.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>xxx.xxx</groupId>
            <artifactId>jarB</artifactId>
        </exclusion>
    </exclusions>
</dependency>

A.jar打包时忽略B.jar (可以使用 optional标签 或 provided作用域)

<dependency>
    <groupId>xxx.xxx</groupId>
    <artifactId>jarB</artifactId>
    <version>0.0.1</version>
    <optional>true</optional>  <!-- optional意思是可选依赖 -->
</dependency>
<dependency>
    <groupId>xxx.xxx</groupId>
    <artifactId>jarB</artifactId>
    <version>0.0.1</version>
    <scope>provided</scope> <!--provided表示 仅编译和测试 -->
</dependency>

maven项目生命周期管理

常用的maven生命周期命令有9种,分别如下

clean—清空target目录下生成的打包文件

mvn clean 

validate–验证项目结构的有效性

mvn validate

compile–编译项目,这个命令需要配置maven-compiler-plugin插件,如果是springboot项目还需要配置spring-boot-maven-plugin插件

mvn compile

test–执行项目的Test case

mvn test

package–执行项目打包 ,打jar包或war包

mvn package

verify–验证项目打包结果

mvn verify

install—上传到本地仓库

mvn install

site—根据JavaDoc注释,生成项目的代码说明文档,生成的内容是一个静态web站点。这个命令需要配置maven-project-info-reports-plugin插件

mvn site

deploy—把打包生成的jar 推送发布到 远程repo上 或 你公司的maven私服上

mvn deploy

注意,以上9个阶段里,每个阶段执行的时候,都会把上面所有的阶段都执行。

如 执行mvn install 时,会把 clean 、validate、compile等所有在install之前的阶段都执行一遍。

maven项目模块聚合与继承

maven聚合

maven多模块项目存在根pom ; 或者maven聚合项目中某个模块没有代码,只有1个pom.xml。

这种项目称之为maven聚合项目。

maven聚合项目的根pom文件,也被成为bom, 意思是物料清单管理。

这种根pom文件的内容和一般的maven项目的pom.xml文件内容有所不同,如下

一般maven项目pom文件指定依赖包的标签是 ,而bom包(根pom文件)使用的是来声明项目所需的依赖

<dependencyManagement>
	<dependencies>
    	<dependency>
        	 <groupId>xxx.xxx</groupId>
             <artifactId>jarA</artifactId>
             <version>0.0.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

maven继承

在maven聚合之后,就可以使用maven的继承能力了。

如,maven多模块项目里 子模块可以继承父模块的部分或全部依赖,这样子模块就不用管理依赖jar的版本号了,而是统一由根pom文件管理。

再如,用STS快速新建一个springboot项目,会发现生成项目里的pom文件里都指定了继承的父项目的依赖, 此时你在中使用springboot官方依赖是不需要指定版本号的,因为bom中已经指定了当前这个springboot项目可用的官方依赖的版本号。

<parent>
    <groupId>org.springframework</groupId>
    <artifactId>spring-framework-bom</artifactId>
    <version>5.3.16</version>
    <relativePath/> 
</parent>

maven项目公共属性的指定

在pom文件中,可以使用标签定义公用的一些版本属性 或 定义项目的编码以及使用的jdk版本。

<properties>
        <java.version>1.8</java.version>
        <poi.version>4.1.2</poi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>${poi.version}</version>  <!-- 这里使用$符合选取上面定义的公共属性 -->
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>${poi.version}</version>
    </dependency>
</dependencies>   

普通maven项目怎么打jar包

大多数情况下,我们都是直接使用生成的springboot项目脚手架来开发后端java项目了,这种是特殊maven项目,因为IDEA ,STS都帮你生成好了项目结构和必要的插件,你引入web-starter后就能开箱即用,开始开发api了 。

springboot项目其实就是一个fat jar ,用开发完api接口后,执行mvn package后得到的是可以执行run的jar ,因为其内置了web容器;且springboot项目打出的jar内置了其需要的第三方jar,所以经常看到一个springboot项目打包后的jar有几百兆,这其实是正常的。

实际上普通maven项目打包,是一个重要的技能。普通maven项目既可以打jar包,也可以打war包;且可以配置jar包直接启动 ;也可以让打出的jar不能启动(如开发dubbo的二方包,只含有公共的interface,可以给其他人的dubbo客户端或服务器端用)。

下面以一个普通java项目(netty服务器端demo)打包成可执行的jar 为例,如下配置生成的jar 可以通过java -jar xxx.jar来run。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.demo</groupId>
    <artifactId>netty-server-test1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>  <!-- 声明要打jar包 -->

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.8</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.50.Final</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <!-- 配置jdk编译版本,编码等级8,编码UTF-8  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- 配置jar包自启动,配置主类 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>cn.demo.App</mainClass>
                            <addClasspath>true</addClasspath>
                            <useUniqueVersions>false</useUniqueVersions>
                            <classpathPrefix>lib/</classpathPrefix>  <!-- jar启动时会去找依赖的lib目录 -->
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

            <!-- 将app依赖的第三方jar包copy到./lib下,因为这个项目依靠一些依赖才能run -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <includeTypes>jar</includeTypes>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            
        </plugins>
    </build>
</project>

上面的配置,配置完后,执行mvn -DskipTests=true clean package 即可开始打jar包,

打出的target目录下除了netty-server-test1-1.0-SNAPSHOT.jar之外,

还有1个lib目录,该目录里存放了中依赖的第三方jar包,如下

|-netty-server-test1-1.0-SNAPSHOT.jar
|-lib
   |--junit-4.13.2.jar
   |--hutool-all-5.7.8.jar
   |--netty-all-4.1.50.Final.jar
   |--lombok-1.18.16.jar

在netty-server-test1-1.0-SNAPSHOT.jar平级目录里执行java -jar netty-server-test1-1.0-SNAPSHOT.jar 即可运行这个项目。

jar包制作exe

这个问题应该分成2类看,一类是如springboot那种的fat jar 直接封包为exe,另一类是如上面的普通maven项目打出的jar已经lib封包成exe。

springboot打包exe

材料:springboot jar + 一个自定义的icon

工具: exe4j 之类的安装包生成器

具体怎么使用exe4j可以百度网上有很多教程, exe4j工具可以生成类似idea安装包那样的exe ,就是exe内部自带了1套jre ,使得客户电脑即使没有安装jdk ,也可以安装和运行这个程序。

普通java项目打包exe

材料:app.jar + lib文件夹( 内部app.jar需要的第三方依赖)+ 一个自定义的icon+ bat脚本(内部定义了 java -jar命令)

工具:batToExe的软件,可以把bat脚本打包成exe安装包,打包好的exe安装到新电脑时会依次解压上面的材料

这个本质是依靠bat启动的jar,客户电脑上还是得安装jdk才能run。

网上还有一些其他安装包工具 和打包教程,大家可以自行百度。

如果你用的是jdk17 ,那你打包exe会更方便,jdk17提供了快速打包exe的工具,好像是叫jlink 工具,bilibili上有教程,想了解的可以自行查询。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkPet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值