业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门

1.Maven 全面概述

Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念(POM),Maven 可以从中央信息中管理项目的构建,报告和文档。

2.Maven 基本功能

因此实际上 Maven 的基本功能就是作为 Java 的项目包管理器,可以快速配置项目的依赖并且进行版本配置管理,其配置的理念是基于项目对象模型 project object model。具体来说,Maven 回使用 pom.xml 这种项目描述文档来描述一个项目以及对应的依赖。

然后再基于这份文档,使用 maven 的命令行工具进行依赖管理即可,类似 CppVcpkg 工具、PythonPip 工具…

3.Maven 使用教程

3.1.下载安装

在安装之前,由于 MavenJava 工具,您必须先保证下载好 Java 才能继续安装 Maven

# 下载安装
# 检查 Java 的版本
$ java --version
openjdk 17.0.13 2024-10-15
OpenJDK Runtime Environment (build 17.0.13+11-Ubuntu-2ubuntu124.04)
OpenJDK 64-Bit Server VM (build 17.0.13+11-Ubuntu-2ubuntu124.04, mixed mode, sharing)# 拉取二进制压缩包并且解压查看
$ wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.zip
$ unzip apache-maven-3.9.9-bin.zip$ cd apache-maven-3.9.9/
$ ls
bin  boot  conf  lib  LICENSE  NOTICE  README.txt# 把二进制可执行文件目录添加到 PATH 环境变量中
$ vim ~/.bashrc && cat ~/.bashrc
# ...
$PATH=<maven_path>:$PATH # 请将 maven# 检查是否安装成功
$ mvn -v
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: /home/ljp/tools/maven/apache-maven-3.9.9
Java version: 17.0.13, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "6.8.0-51-generic", arch: "amd64", family: "unix"

3.2.可选配置

  • MAVEN_ARGS 环境变量(操作 MVC 的参数)Maven 3.9.0 开始,此变量包含传递给 Maven 的参数,优先于用户的命令行参数。例如,可以通过 -B -V checkstyle:checkstyle 定义选项和目标。其中 -B 表示跳过交互式提示,-V 表示显示 Maven 的版本信息,checkstyle:checkstyle 是一个目标任务,表示运行 Checkstyle 插件进行代码检查。

  • MAVEN_OPTS 环境变量(操作 JVM 的参数) 该变量包含用于启动 Maven 所需的 JVM 参数,可以用来向 JVM 提供额外的选项。例如,JVM 的内存设置可以通过 -Xms256m -Xmx512m 来定义。

  • settings.xml 文件 settings.xml 用于存储跨项目的 Maven 配置,通常存储在两个目录中

    • 用户级别配置目录 $USER_HOME/.m2/settings.xml
    • 全局级别配置目录 $MAVEN_HOME/conf/settings.xml

    您可以稍微查看一下全局级别配置文件,稍微了解一下,当存在用户级别配置文件时,就会优先使用用户级别配置文件。

    <!-- settings.xml -->
    <?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"><!-- 配置本地仓库| 配置 Maven 下载好后的依赖存储目录|| 默认值: ${user.home}/.m2/repository<localRepository>/path/to/local/repo</localRepository>--><!-- 配置交互模式| 配置 Maven 是否运行过程和用户交互| | 默认值: true<interactiveMode>true</interactiveMode>--><!-- 配置离线模式| 配置 Maven 是否直接在本地获取依赖|| 默认值: false<offline>false</offline>--><!-- 配置插件小组| 配置 Maven 配置插件的查询地址标识|| 默认值: 无默认值|--><pluginGroups><!-- pluginGroup<pluginGroup>com.your.plugins</pluginGroup>--></pluginGroups><!-- 配置代理服务| 配置 Maven 访问外部仓库时代理服务|| 默认值: 无默认值|--><proxies><!-- proxy<proxy><id>optional</id><active>true</active><protocol>http</protocol><username>proxyuser</username><password>proxypass</password><host>proxy.host.net</host><port>80</port><nonProxyHosts>local.net|some.host.com</nonProxyHosts></proxy>--></proxies><!-- 配置本机认证| 配置 Maven 访问远端仓库的认证信息|--><servers><!-- server 使用密码<server><id>deploymentRepo</id><username>repouser</username><password>repopwd</password></server>--><!-- server 使用密钥<server><id>siteServer</id><privateKey>/path/to/private/key</privateKey><passphrase>optional; leave empty if not used.</passphrase></server>--></servers><!-- 配置镜像地址| 配置 Maven 镜像地址提高下载速度||--><mirrors><!-- mirror<mirror><id>mirrorId</id><mirrorOf>repositoryId</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://my.repository.com/repo/path</url></mirror>--><mirror><id>maven-default-http-blocker</id><mirrorOf>external:http:*</mirrorOf><name>Pseudo repository to mirror external repositories initially using HTTP.</name><url>http://0.0.0.0/</url><blocked>true</blocked></mirror></mirrors><!-- 配置特定设置| 配置 Maven 根据标识激活特定设置| 例如使用 -D env=dev 就可以触发 name=env value=dev 所对应的 activation 设置||--><profiles><!-- profile<profile><id>env-dev</id><activation><property><name>target-env</name><value>dev</value></property></activation><properties><tomcatPath>/path/to/tomcat/instance</tomcatPath></properties></profile>--><!-- profile<profile><id>jdk-1.4</id><activation><jdk>1.4</jdk></activation><repositories><repository><id>jdk14</id><name>Repository for JDK 1.4 builds</name><url>http://www.myhost.com/maven/jdk14</url><layout>default</layout><snapshotPolicy>always</snapshotPolicy></repository></repositories></profile>--></profiles><!-- activeProfiles| 配置 Maven 平时默认激活特定设置|<activeProfiles><activeProfile>填写上面定义的 value</activeProfile><activeProfile>可以继续填写...</activeProfile></activeProfiles>-->
    </settings>
  • .mvn 目录 位于 Maven 项目的顶级目录中,一般包含三个文件

    • .mvn/maven.configMaven 3.3.1+ 开始,可以通过 .mvn/maven.config 文件简化 Maven 命令行参数的设置(每个参数最好直接单独一行),这样就不再需要使用 MAVEN_ARGS

    • .mvn/jvm.configMaven 3.3.1+ 开始,可以通过 .mvn/jvm.config 文件为每个项目定义 JVM 配置(每个参数最好直接单独一行),这样就不再需要使用 MAVEN_OPTS

    • .mvn/extensions.xml 过去的做法(直到 Maven 3.2.5)是创建一个 JAR 文件并将其手动放入 ${MAVEN_HOME}/lib/ext 目录中,或者通过 mvn -Dmaven.ext.class.path=extension.jar 命令行选项来加载扩展。现在可以通过定义 .mvn/extensions.xml,一般实际开发中用来拓展 Maven 核心功能的,和 settings.xml 作用还是有很大不同的,不要混淆一谈,有需要了解一下即可(修改后可用 mvn help:effective-settings 进行配置检查)。

[!IMPORTANT]

补充:不过一般情况下,我们无需改动以上的环境变量和配置文件。

  • 对于环境变量一般使用 .mvn/maven.config.mvn/jvm.config 来替代,这样每一个项目配置起来比较灵活
  • 一般也用不到 .mvn/extensions.xml 这种需要拓展 Maven 功能。
  • 而对于经过正常魔法手段的网络环境下,一般也无需配置 settings.xml,使用默认的即可,如果需要修改,一般也只有以下三个个人开发者需求(最好只修改用户级别的 settings.xml 配置文件)
    • 可能需要改动依赖存储的目录,以避免系统磁盘占用过多,只需要改动 <localRepository> 标签即可
    • 可能需要改动网络代理的配置,以使用魔法阵来健康上网,只需要改动 <proxy> 标签即可
    • 可能需要配置一些插件,后续使用 Maven 管理的 Java 项目(这里指专门开发 Maven 插件的 Java 项目)开发完毕后进行 mvn install 后会把插件安装到本地仓库 ~/.m2/repository/ 中,此时需要使用这里面的插件标签来标识该插件以简化命令行的使用

因此总结来说,使用 .mvn/maven.config.mvn/jvm.configsettings.xml 的概率是最大的。

另外,一般开发环境使用 mvn 的命令行多一些,因为命令行的可选参数优先级最高,可以覆盖 .mvn/maven.config.mvn/jvm.config 这两个配置文件。而测试环境、生产环境一般使用 .mvn/maven.config.mvn/jvm.config 这两个配置文件会多一些,因为更加方便。

3.3.常用指令

这里先列出并且大概说下 mvn 工具的常见指令。

  • mvn [options] [<goal(s)>] [<phase(s)>] 使用通用的
    • options 可选参数,比如 -Dproperty=value(设置属性)、-X(启用调试模式)等
    • goal 具体目标,通常是指执行某些自定插件
    • phase 生命阶段,通常是指生命周期内的阶段
  • mvn -h 可以查询相关的指令帮助
  • mvn verify 最为典型的指令调用

[!IMPORTANT]

补充:Maven 生命周期是一套预定义的 phases, 构建阶段,确保项目按照既定顺序进行构建。Maven3Lifecycle, 生命周期,分别是

  • clean(“清理” 生命周期),包含多个阶段。本生命周期内,在执行某个阶段时,会自动执行该阶段前面的所有阶段
    • pre-clean:执行清理前的操作
    • clean:删除 target/ 目录
    • post-clean:执行清理后的操作
  • default(“构建” 生命周期),包含多个阶段。本生命周期内,在执行某个阶段时,会自动执行该阶段前面的所有阶段
    • validate 验证项目是否正确,并检查 pom.xml 配置
    • compile 编译源码(src/main/java)到 target/classes
    • test 运行单元测试(基于 src/test/java),不过有时可以使用 mvn clean package -DskipTests 跳过测试阶段
    • package 将编译后的代码打包(如 jarwar
    • verify 运行集成测试,确保打包的应用正常
    • install 安装 jar/war 到本地仓库下(~/.m2/repository/),一般会安装一些项目,比如自定义的插件项目和其他的服务项目,以方便别的项目进行本地依赖
    • deploy 发布 jar/war 到远程仓库(如 Nexus
  • site(“文档” 生命周期),包含多个阶段。本生命周期内,在执行某个阶段时,会自动执行该阶段前面的所有阶段
    • pre-site:执行文档生成前的任务
    • site:生成 HTML 文档
    • post-site:执行文档生成后的任务
    • site-deploy:发布站点到服务器

而在 pom.xml 中的 plugin, 插件 标签可以绑定到特定阶段,扩展构建过程。也就是说,您可以在 Maven 的构建过程中,插入额外的任务(例如代码生成、代码检查、打包方式自定义等),以干预生命周期的行为。

3.4.代码实践

3.4.1.编写普通 Maven 项目
3.4.1.1.创建项目
# 创建项目
$ mvn archetype:generate -DgroupId=com.work -DartifactId=work-maven-test -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false# archetype:generate 是插件中定义的目标, 用来基于模板生成新项目结构
# -DgroupId 指定本项目的 groupId, 就是公司域名的倒写
# -DartifactId 指定本项目的 artifactId, 就是本项目的具体名称
# -DarchetypeArtifactId 指定本项目的 archetypeArtifactId, 就是生成本项目所使用的项目模板
# -DarchetypeVersion=1.5 指定本项目的 archetypeVersion, 就是所使用的 Archetype 模板的版本
# -DinteractiveMode=false 表示禁用交互模式, 避免用户手动输入, 转为让 Maven 自动进行配置填充参数
# 以下是上述指令的运行结果...[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-antrun-plugin/3.1.0/maven-antrun-plugin-3.1.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-antrun-plugin/3.1.0/maven-antrun-plugin-3.1.0.pom (9.1 kB at 7.6 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-antrun-plugin/3.1.0/maven-antrun-plugin-3.1.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-antrun-plugin/3.1.0/maven-antrun-plugin-3.1.0.jar (41 kB at 74 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-assembly-plugin/3.7.1/maven-assembly-plugin-3.7.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-assembly-plugin/3.7.1/maven-assembly-plugin-3.7.1.pom (15 kB at 46 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-assembly-plugin/3.7.1/maven-assembly-plugin-3.7.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-assembly-plugin/3.7.1/maven-assembly-plugin-3.7.1.jar (240 kB at 142 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/3.7.0/maven-dependency-plugin-3.7.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/3.7.0/maven-dependency-plugin-3.7.0.pom (19 kB at 30 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/3.7.0/maven-dependency-plugin-3.7.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-dependency-plugin/3.7.0/maven-dependency-plugin-3.7.0.jar (207 kB at 41 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/3.0.1/maven-release-plugin-3.0.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/3.0.1/maven-release-plugin-3.0.1.pom (9.8 kB at 16 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/release/maven-release/3.0.1/maven-release-3.0.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/release/maven-release/3.0.1/maven-release-3.0.1.pom (11 kB at 20 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/3.0.1/maven-release-plugin-3.0.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/3.0.1/maven-release-plugin-3.0.1.jar (61 kB at 36 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml
Downloading from central: https://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml (14 kB at 26 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml (21 kB at 11 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/maven-metadata.xml
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-archetype-plugin/maven-metadata.xml (1.0 kB at 3.6 kB/s)
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] >>> archetype:3.3.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< archetype:3.3.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- archetype:3.3.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
Downloading from central: https://repo.maven.apache.org/maven2/archetype-catalog.xml
Downloaded from central: https://repo.maven.apache.org/maven2/archetype-catalog.xml (16 MB at 18 kB/s)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/ljp/data/ljp/test
[INFO] Parameter: package, Value: com.work
[INFO] Parameter: groupId, Value: com.work
[INFO] Parameter: artifactId, Value: work-maven-test
[INFO] Parameter: packageName, Value: com.work
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/ljp/data/ljp/test/work-maven-test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  15:25 min
[INFO] Finished at: 2025-02-11T13:07:47+08:00
[INFO] ------------------------------------------------------------------------

然后查看一下创建好的项目中生成的比较重要的项目文件。

# 查看配置好的项目
$ ls
work-maven-test
$ tree work-maven-test
├── pom.xml
└── src├── main│   └── java│       └── com│           └── work│               └── App.java└── test└── java└── com└── work└── AppTest.java10 directories, 3 files
<!-- pox.xml -->
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.work</groupId><artifactId>work-maven-test</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>work-maven-test</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>
// App.java
package com.work;/*** Hello world!**/
public class App 
{public static void main( String[] args ){System.out.println( "Hello World!" );}
}
// AppTest.java
package com.work;import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;/*** Unit test for simple App.*/
public class AppTest extends TestCase
{/*** Create the test case** @param testName name of the test case*/public AppTest( String testName ){super( testName );}/*** @return the suite of tests being tested*/public static Test suite(){return new TestSuite( AppTest.class );}/*** Rigourous Test :-)*/public void testApp(){assertTrue( true );}
}

[!IMPORTANT]

补充:欸,好像上述的结果和我们直接使用 IDEA 中的内置 Maven 创建的 Java 项目不太一样,原因是因为使用不同的模板,我们使用的模板适合大部分的 Java 项目。

src/main/java 目录包含项目源代码,src/test/java 目录包含测试源,而 pom.xml文件是项目的项目对象模型,主要用于描述本项目(的依赖情况)。

3.4.1.2.编写项目

pom.xml 可能看上去有些许复杂,但是我可以帮助您抽丝剥茧,简化您对该文件的理解难度,因此我对上述的 pom.xml 做了一些修改和注释,以供您理解和作为模板参考。

<!-- 理解 pox.xml -->
<!--'xmlns=' XML 命名空间'xmlns:xsi' XML Schema 实例命名空间'xsi:schemaLocation=' 指定 XML Schema 位置这些声明的主要作用是帮助 XML 解析器正确地验证和处理 Maven POM 文件,确保它符合 Maven 规范。-->
<projectxmlns="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/maven-v4_0_0.xsd"><!-- 指定 Maven 项目对象模型 POM 的版本 --><modelVersion>4.0.0</modelVersion><!-- 定义项目的所属组织 --><groupId>com.work</groupId><!-- 定义项目的具体名称 --><artifactId>work-maven-test</artifactId><!-- 指定项目构建的打包类型为 .jar --><packaging>jar</packaging><!-- 定义项目的版本号 --><version>v0.1.0</version><!-- 和 artifactId 的名称保持一样即可(这是一个可选字段) --><name>work-maven-test</name><!-- 填写为本项目制定的官方网址 --><url>https://work-maven-test.work.com</url><!-- 填写所有依赖项的容器, 在内部填写一个一个 dependency 标签 --><url>http://maven.apache.org</url><!-- 填写依赖的 Java 版本 --><properties><java.version>17</java.version></properties><dependencies><!-- 依赖名称: 依赖官网/依赖源码 --><!-- Junit: https://junit.org/junit5/ --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope> <!-- 如果不指定 scope 会默认将依赖设置为 compile 生命阶段, 因此设置 scope 本质是确保某些依赖只在某个阶段被使用 --></dependency></dependencies>
</project>

我们引入一个依赖到项目中进行实战,就选择 Google 开发的 Gson 吧,再次修改 pom.xml

<!-- 修改 pom.xml -->
<!--'xmlns=' XML 命名空间'xmlns:xsi' XML Schema 实例命名空间'xsi:schemaLocation=' 指定 XML Schema 位置这些声明的主要作用是帮助 XML 解析器正确地验证和处理 Maven POM 文件,确保它符合 Maven 规范。-->
<projectxmlns="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/maven-v4_0_0.xsd"><!-- 指定 Maven 项目对象模型 POM 的版本 --><modelVersion>4.0.0</modelVersion><!-- 定义项目的所属组织 --><groupId>com.work</groupId><!-- 定义项目的具体名称 --><artifactId>work-maven-test</artifactId><!-- 指定项目构建的打包类型为 .jar --><packaging>jar</packaging><!-- 定义项目的版本号 --><version>v0.1.0</version><!-- 和 artifactId 的名称保持一样即可(这是一个可选字段) --><name>work-maven-test</name><!-- 填写为本项目制定的官方网址 --><url>https://work-maven-test.work.com</url><!-- 填写依赖的 Java 版本 --><properties><java.version>17</java.version></properties><!-- 填写所有依赖项的容器, 在内部填写一个一个 dependency 标签 --><dependencies><!-- 依赖名称: 依赖官网/依赖源码 --><!-- Junit: https://junit.org/junit5/ --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope> <!-- 如果不指定 scope 会默认将依赖设置为 compile 生命阶段, 因此设置 scope 本质是确保某些依赖只在某个阶段被使用 --></dependency><!-- Gson: https://github.com/google/gson --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.12.1</version></dependency></dependencies>
</project>

然后修改 App.java 文件,在内部使用关于 Gson 的代码进行依赖测试。

// 修改 App.java
package com.work;import com.google.gson.Gson;public class App {public static void main(String[] args) {// 创建一个对象Person person = new Person("John", 30);// 创建Gson实例Gson gson = new Gson();// 将对象转换为 JSON 字符串String json = gson.toJson(person);System.out.println("JSON Output: " + json);// 将 JSON 字符串转换为对象Person personFromJson = gson.fromJson(json, Person.class);System.out.println("Person Name: " + personFromJson.getName());System.out.println("Person Age: " + personFromJson.getAge());}
}class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}

然后清理项目,打包得到我们的 jar 包(跳过测试阶段),最后看看能不能得到预期的结果。

# 查看执行结果
$ mvn clean package -DskipTests
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< com.work:work-maven-test >----------------------
[INFO] Building work-maven-test v0.1.0
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.12.1/gson-2.12.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.12.1/gson-2.12.1.pom (13 kB at 11 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.12.1/gson-parent-2.12.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson-parent/2.12.1/gson-parent-2.12.1.pom (27 kB at 38 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.pom (4.3 kB at 17 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.36.0/error_prone_parent-2.36.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_parent/2.36.0/error_prone_parent-2.36.0.pom (16 kB at 58 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.12.1/gson-2.12.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.12.1/gson-2.12.1.jar (286 kB at 384 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.jar
Downloaded from central: https://repo.maven.apache.org/maven2/com/google/errorprone/error_prone_annotations/2.36.0/error_prone_annotations-2.36.0.jar (19 kB at 77 kB/s)
[INFO] 
[INFO] --- clean:3.2.0:clean (default-clean) @ work-maven-test ---
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ work-maven-test ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/ljp/data/ljp/test/work-maven-test/src/main/resources
[INFO] 
[INFO] --- compiler:3.13.0:compile (default-compile) @ work-maven-test ---
[INFO] Recompiling the module because of changed source code.
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target/classes
[WARNING] 未与 -source 8 一起设置引导类路径
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ work-maven-test ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/ljp/data/ljp/test/work-maven-test/src/test/resources
[INFO] 
[INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ work-maven-test ---
[INFO] Recompiling the module because of changed dependency.
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target/test-classes
[WARNING] 未与 -source 8 一起设置引导类路径
[INFO] 
[INFO] --- surefire:3.2.5:test (default-test) @ work-maven-test ---
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/3.2.5/maven-surefire-common-3.2.5.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/3.2.5/maven-surefire-common-3.2.5.jar (308 kB at 640 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/3.2.5/surefire-api-3.2.5.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-logger-api/3.2.5/surefire-logger-api-3.2.5.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-extensions-api/3.2.5/surefire-extensions-api-3.2.5.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/3.2.5/surefire-booter-3.2.5.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-extensions-spi/3.2.5/surefire-extensions-spi-3.2.5.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-logger-api/3.2.5/surefire-logger-api-3.2.5.jar (14 kB at 55 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/3.1.1/maven-common-artifact-filters-3.1.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-common-artifact-filters/3.1.1/maven-common-artifact-filters-3.1.1.jar (61 kB at 96 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-extensions-spi/3.2.5/surefire-extensions-spi-3.2.5.jar (8.2 kB at 9.6 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-shared-utils/3.2.5/surefire-shared-utils-3.2.5.jar
Downloaded from central: https://repo.maven.apache.org/maven2/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar (501 kB at 417 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/3.2.5/surefire-api-3.2.5.jar (171 kB at 130 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/3.2.5/surefire-booter-3.2.5.jar (118 kB at 85 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-extensions-api/3.2.5/surefire-extensions-api-3.2.5.jar (26 kB at 12 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-shared-utils/3.2.5/surefire-shared-utils-3.2.5.jar (2.4 MB at 1.1 MB/s)
[INFO] Tests are skipped.
[INFO] 
[INFO] --- jar:3.4.1:jar (default-jar) @ work-maven-test ---
[INFO] Building jar: /home/ljp/data/ljp/test/work-maven-test/target/work-maven-test-v0.1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.012 s
[INFO] Finished at: 2025-02-11T15:36:18+08:00
[INFO] ------------------------------------------------------------------------# 找到上述 Build 成功的 jar 所在地
$ ls
pom.xml  src  target$ cd target && ls
classes            generated-test-sources  maven-status  work-maven-test-v0.1.0.jar
generated-sources  maven-archiver          test-classes$ java -jar work-maven-test-v0.1.0.jar
work-maven-test-v0.1.0.jar中没有主清单属性

欸怎么回事?没有主清单属性其实是因为 work-maven-test-v0.1.0.jar 文件中的 META-INF/MANIFEST.MF 文件在打包的时候没有指定启动主类,我们需要自己添加主类位置(或者您使用 jar -xf work-maven-test-v0.1.0.jar 解包后在 META-INF/MANIFEST.MF 中添加 Main-Class: com.example.Main 也是可以的,不过我个人不推荐这么做)。

# 尝试运行 jar 包
$ java -cp "work-maven-test-v0.1.0.jar" com.work.App
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gsonat com.work.App.main(App.java:11)
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gsonat java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)... 1 more

嗯?怎么找不到 Gson 包,其实是需要我们手动引入才可以,早在使用 package 时就拉取了 Gson.jar 包,找到后一起运行即可。

# 再次尝试运行
$ java -cp "work-maven-test-v0.1.0.jar:/home/ljp/.m2/repository/com/google/code/gson/gson/2.12.1/gson-2.12.1.jar" com.work.App
JSON Output: {"name":"John","age":30}
Person Name: John
Person Age: 30

终于运行成功了,但是每次都需要这么做有些麻烦,有没有便携的方法呢?有!

# 确保在项目根目录下执行下面的指令
$ mvn exec:java -Dexec.mainClass="com.work.App"
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< com.work:work-maven-test >----------------------
[INFO] Building work-maven-test v0.1.0
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- exec:3.5.0:java (default-cli) @ work-maven-test ---
Downloading from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/4.0.2/plexus-utils-4.0.2.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/4.0.2/plexus-utils-4.0.2.pom (13 kB at 5.7 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.4.0/commons-exec-1.4.0.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.4.0/commons-exec-1.4.0.pom (9.5 kB at 24 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7.1/asm-9.7.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7.1/asm-9.7.1.pom (2.4 kB at 3.2 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.7.1/asm-commons-9.7.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.7.1/asm-commons-9.7.1.pom (2.8 kB at 10 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.7.1/asm-tree-9.7.1.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.7.1/asm-tree-9.7.1.pom (2.6 kB at 9.4 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/4.0.2/plexus-utils-4.0.2.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/4.0.2/plexus-utils-4.0.2.jar (193 kB at 82 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.4.0/commons-exec-1.4.0.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7.1/asm-9.7.1.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.7.1/asm-commons-9.7.1.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.7.1/asm-tree-9.7.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/9.7.1/asm-commons-9.7.1.jar (73 kB at 98 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/9.7.1/asm-tree-9.7.1.jar (52 kB at 47 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.4.0/commons-exec-1.4.0.jar (66 kB at 57 kB/s)
Downloaded from central: https://repo.maven.apache.org/maven2/org/ow2/asm/asm/9.7.1/asm-9.7.1.jar (126 kB at 98 kB/s)
JSON Output: {"name":"John","age":30}
Person Name: John
Person Age: 30
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.002 s
[INFO] Finished at: 2025-02-11T16:21:36+08:00
[INFO] ------------------------------------------------------------------------

果然,无需我们做什么,就可以直接借用 mvn 的手来自动配置所有的依赖,可以完全确保跟着 pom.xml 填写配置来自动管理依赖。

[!IMPORTANT]

补充:不过在有些时候不应该借助 mvn 来运行,而应该把所有的依赖都打进 .jar 中,例如生产环境中是几乎不可能安装一个 Maven 在生产环境中的,必须保证 Jave 运行时环境可以直接使用 .jar 包。

对于我们上述的项目来说可以尝试使用 maven-jar-plugin 插件,而对于一些 spring boot 项目中,经常可以看到有人会使用 spring-boot-maven-plugin 插件来把所有的依赖都打进一个 .jar 包中。

<project><!-- 其他的配置标签 --><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration><archive><manifestEntries><Main-Class>com.work.App</Main-Class></manifestEntries></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

这样就可以直接使用 java -jar target/work-maven-test-v0.1.0-jar-with-dependencies.jar 来得到结果了。至于 Spring Boot 项目的,我暂时给出下面的插件配置,但是等您了解了 Spring Boot 的使用时,我们再来进行实验。

<project><!-- 其他的配置标签 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
3.4.2.创建插件 Maven 项目
3.4.2.1.创建项目

接下来我们不再使用命令行的配置,而是转为使用 IDEA 中的集成 Maven 来创建项目(因此默认使用 maven-archetype-webapp 模板来生成项目),实战的同时编写一个插件项目,并且通过生命阶段 install 安装到本地项目中,最好优化使用体验,使得用户可以在 Maven 中使用该插件来执行某一个目标。

我们定义一个额外的插件查找路径,以 prefix:goal 方式执行自定义插件。假设您有一个 Maven 插件,名为 com.work:my-plugin(也就是 Group ID:Artifact ID),其中包含一个 sayhello 目标(goal)。

并且您希望用户能够使用 mvn my:sayhello,而不是完整的 mvn com.work:my-plugin:sayhello

在这里插入图片描述

[!NOTE]

吐槽:目标这个说法我怀疑是来自于 makefile 这些早期的构建工具,每一个目标说白了就是对应一个构建指令。

3.4.2.2.编写项目

首先,您需要一个自定义 Maven 插件 my-plugin,还是像之前一样构建一个项目后,定义我们的 pom.xml

<!-- pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!--'xmlns=' XML 命名空间'xmlns:xsi' XML Schema 实例命名空间'xsi:schemaLocation=' 指定 XML Schema 位置这些声明的主要作用是帮助 XML 解析器正确地验证和处理 Maven POM 文件,确保它符合 Maven 规范。-->
<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"><!-- 指定 Maven 项目对象模型 POM 的版本 --><modelVersion>4.0.0</modelVersion><!-- 定义项目的所属组织 --><groupId>com.work</groupId><!-- 定义项目的具体名称 --><artifactId>my-plugin</artifactId><!-- 指定项目构建的打包类型为 .jar --><packaging>jar</packaging><!-- 定义项目的版本号 --><version>v0.1.0</version><!-- 和 artifactId 的名称保持一样即可(这是一个可选字段) --><name>my-plugin</name><!-- 填写为本项目制定的官方网址 --><url>https://my-plugin.work.com</url><!-- 填写依赖的 Java 版本 --><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 填写所有依赖项的容器, 在内部填写一个一个 dependency 标签 --><dependencies><!-- 依赖名称: 依赖官网/依赖源码 --><!-- Junit: https://junit.org/junit5/ --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope> <!-- 如果不指定 scope 会默认将依赖设置为 compile 生命阶段, 因此设置 scope 本质是确保某些依赖只在某个阶段被使用 --></dependency><!-- maven-plugin-api: https://maven.apache.org/ref/3.9.9/maven-plugin-api/ --><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.8.1</version></dependency></dependencies>
</project>

[!CAUTION]

警告:编写好 pom.xml 后一定要点击下面这个按钮来同步配置。

在这里插入图片描述

注意上面的 pom.xml 中我们引入的 maven-plugin-api 提供了用于开发 Maven 插件的核心 API。利用依赖来实现 sayhello 目标(MyMojo.java),是的你没看错 mvc 的指令是可以使用 Java 来实现的。

不过我还没怎么仔细查阅插件开发文档,以后有需要再补充吧,待补充…

3.5.自搭仓库

自行搭建一个 Maven 仓库,也还没怎么仔细查阅文档,以后有需要再来补充吧,待补充…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布

作者&#xff1a;何亮&#xff0c;Apache Dubbo Contributor Apache Dubbo OpenAPI 简介 设计背景 在微服务体系中&#xff0c;RPC 服务的文档管理、测试、调用协作一直都是影响研发效能的关键一环&#xff0c;这些难题通常是由于 RPC 的特性所决定的&#xff1a;RPC 服务的…

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读&#xff0c;因为AVL树是平衡二叉树的一种优化&#xff0c;其大部分实现逻辑与平衡二叉树是…

python-leetcode 25.环形链表

题目&#xff1a; 给定一个链表的头节点head,判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链表尾连接到链表中的位置&#xff08;…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

SQL Server安装流程

SQL Server 2022在安全性、可用性和性能方面不断创新&#xff0c;是现在最支持Azure的SQL Server版本。 SQL Server发展史 SQL Server的历史始于1989年&#xff0c;当时是由微软与Sybase合作的产品&#xff0c;旨在为Windows NT操作系统提供一个高性能的数据库解决方案。随着…

C# 上位机--变量

C# 上位机--变量 在 C# 上位机开发领域&#xff0c;变量是构建程序逻辑的基础元素之一。它就像是一个容器&#xff0c;用于存储各种类型的数据&#xff0c;从简单的数值到复杂的对象。正确理解和使用变量&#xff0c;对于开发出高效、稳定且易于维护的上位机程序至关重要。本文…

Vue3(1)

一.create-vue // new Vue() 创建一个应用实例 > createApp() // createRouter() createStore() // 将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性import { createApp } from vue import App from ./App.vue// mount 设置挂载点 #app (id为app的盒子) createA…

Redis 数据类型 List 列表

列表类型是⽤来存储多个有序的字符串&#xff0c;如下图所⽰&#xff0c;a、b、c、d、e 五个元素从左到右组成了⼀个有序的列表&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储 2^32 - 1个元素。在 Redis 中&#xff…

yum报错 Could not resolve host: mirrorlist.centos.org

检查dns 使用ping www.baidu.com &#xff0c;如果ping不通&#xff0c;检查/etc/resolv.conf文件中是否有&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…

STM32F103C8----外部中断探秘:解锁嵌入式实时响应的关键

​​​ 一、引言 在嵌入式系统的广袤世界里&#xff0c;中断就如同一位高效的调度员&#xff0c;发挥着举足轻重的作用。想象一下&#xff0c;一个嵌入式系统就像一个繁忙的工厂&#xff0c;CPU 如同工厂里的核心工人&#xff0c;负责执行各种任务。如果没有中断机制&#x…

分层解耦-IOC DI 入门

步骤 ①.Service层及 Dao层的实现类&#xff0c;交给I0C容器管理。 ②.为Controller及Service注入运行时&#xff0c;依赖的对象。 ③.运行测试。 添加注解进行分层耦合 Component 会将当前类交给IOC容器管理,成为IOC容器中的bean - 控制反转 Autowired 运行时,IOC容器…

SQL Server 逻辑查询处理阶段及其处理顺序

在 SQL Server 中&#xff0c;查询的执行并不是按照我们编写的 SQL 语句的顺序进行的。相反&#xff0c;SQL Server 有自己的一套逻辑处理顺序&#xff0c;这个顺序决定了查询的执行方式和结果集的生成。了解这些处理阶段和顺序对于优化查询性能和调试复杂查询非常重要。 SQL …

问题:通过策略模式+工厂模式+模板方法模式实现ifelse优化

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 示例&#xff1a;商城系统有会员系统&#xff0c;不同会员有不同优惠程度&#xff0c;普通会员不优惠&#xff1b;黄金会员打8折&#xff1b;白金会员优惠50元&#xff0c;再打7折&#xff1b; 问题描…

MYSQL利用PXC实现高可用

PXC常用端口 3306&#xff1a;数据库对外服务端口号 4444&#xff1a;请求SST的端口 4567&#xff1a;组成员之间进行沟通的端口号 4568&#xff1a;用于传输IST 搭建PXC集群 服务配置&#xff1a; 主机系统&#xff1a;rocky8.0 主机1&#xff1a;172.25.254.101 主机…

2.11寒假作业

web&#xff1a;[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的&#xff0c;随便输入进行看看 提示错误&#xff0c;看源码其中的js代码 这个代码很容易理解&#xff0c;要让输入的内容等于对应的字符串&#xff0c;显然直接复制粘贴是错的 这串字符看起来像是base64加密&…

innovus如何分步长func和dft时钟

在Innovus工具中&#xff0c;分步处理功能时钟&#xff08;func clock&#xff09;和DFT时钟&#xff08;如扫描测试时钟&#xff09;需要结合设计模式&#xff08;Function Mode和DFT Mode&#xff09;进行约束定义、时钟树综合&#xff08;CTS&#xff09;和时序分析。跟随分…

《DeepSeek技术应用与赋能运营商办公提效案例实操落地课程》

大模型算法实战专家—周红伟老师 法国科学院数据算法博士/曾任阿里巴巴人工智能专家/曾任马上消费企业风控负责人 课程背景 随着大模型技术的迅猛发展&#xff0c;企业面临着提升工作效率、降低运营成本和优化资源配置的巨大压力。DeepSeek做出十三项革命性的大模型技术突破…

大模型基本原理(二)——ChatGPT的工作原理

如何得到一个ChatGPT&#xff1f; 1、无监督预训练&#xff1a;通过大量的文本数据集进行无监督训练&#xff0c;得到一个基座模型&#xff08;只会续写文本&#xff09; 2、监督微调&#xff1a;通过一些人类撰写的高质量对话数据对基座模型进行监督微调&#xff0c;得到一个…

示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…