最近的项目中接触到一些没有任何框架的项目需要打 jar 包的问题。
发现原先使用框架一键打包的背后,其实有挺多知识点可以学习,这里记录一下 IT 新人的一点点学习笔记。
Maven 是什么
Maven官网
官网中是这样介绍 Maven 的:
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从中心信息段管理项目的构建、报告和文档。
我个人的通俗理解是,Maven 是一个 Java 的包管理工具及打包工具,让你可以方便的从远程仓库获取依赖包及打包工程。这样就有了一个统一的权威的公共包仓库,避免了很久以前那种满世界找依赖包还要担心是不是被人改过有问题的尴尬场面。
Maven 的安装
Maven 安装网上已经有很多教程了,就不复述,直接引用了
Maven 安装
Maven 在线仓库
现在我有了 Maven,我应该怎么使用他找到我要的依赖包呢?
介绍一下在线的仓库可以方便的搜索到你想要的依赖包
Maven 在线仓库
Maven 语法
运行Maven的语法如下:
mvn [options] [<goal(s)>] [<phase(s)>]
所有可用选项都记录在内置的帮助中,您可以使用这些帮助进行访问
mvn -h
构建Maven项目的典型调用使用Maven生命周期阶段。 例如。
mvn package
命令 | 说明 |
---|---|
mvn compile | 编译Java源代码 |
mvn package | 打包Java项目 |
mvn deploy | 将Java项目发布到Maven仓库 |
mvn clean | 删除构建目录 |
新建一个 Maven 项目
File -> new -> Project
选择 Maven 项目
输入 GroupId(组织 ID,一般为 com.公司名) ArtifactId(项目ID),还有项目版本
然后 Finish 创建项目
pom.xml文件是Maven中项目配置的核心。 它是一个配置文件,其中包含以所需方式构建项目所需的大多数信息。 POM非常庞大,其复杂性可能令人畏惧,但不必有效地使用它就不必了解所有复杂性。 该项目的POM为:
引用依赖
在本文上面提供的 Maven 在线仓库中搜索依赖 junit
选择自己要的版本
复制依赖
复制到项目中,如果没有标签的话可以像图中加入,点击右下角导入变化,等包下载完成就会发现右侧依赖中 junit 已经下载完成
同样的方法查询 fastjson (阿里巴巴的 json 工具类)用于测试使用
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
也可以设置自动导入,这样之后 Pom 文件有修改就会自动重新导入依赖
新建自己的测试方法类
import com.alibaba.fastjson.JSONObject;
public class test {
public void test(){
JSONObject json = new JSONObject();
json.put("meg","这里是 testDemo1的 json 数据");
System.out.println(json.toJSONString());
}
public static void main(String[] args) {
JSONObject json = new JSONObject();
json.put("meg","这里是 testDemo1 主方法中的 的 json 数据");
System.out.println(json.toJSONString());
}
}
打 jar 包
这里使用 maven-assembly-plugin 插件进行打包
<build>
<plugins>
<!-- 跳过依赖 -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- 设置打包 jdk -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--正常打包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<!-- jar 包 主入口方法 指向刚刚写的 test 方法-->
<manifest>
<mainClass>test</mainClass>
</manifest>
<!-- 打包时加入本地 jar 包-->
<!--<manifestEntries>-->
<!--<Class-Path>lib/*.jar</Class-Path>-->
<!--</manifestEntries>-->
</archive>
<descriptors>
<!--assembly配置文件路径,注意需要在项目中新建文件assembly/release.xml-->
<descriptor>${basedir}/src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在 resources 文件夹下添加配置文件
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>release</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>system</scope>
</dependencySet>
</dependencySets>
</assembly>
点击右侧 package,等待打包结束后,会在 target 目录下生成 testDemo1-1.0-SNAPSHOT-jar-with-dependencies.jar ,这个就是我们打出来的包含依赖的 jar 包
验证 jar 包
打开终端
运行 jar 包主函数
java -jar testDemo1-1.0-SNAPSHOT-release.jar
可以看到,执行了 test 类中的 Main 方法,使用了 fastjson 的依赖打印
其他项目引用 jar 包
重复上面新建 Maven 项目的教程,新建项目 testDemo2
添加本地 jar 包
创建 lib 文件夹并添加刚刚打包出的 jar 包
添加依赖及打包插件
完整 pom 代码,注意要插件中添加本地依赖,否则打 jar 包时不会添加本地 jar 包依赖
<?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>com.test</groupId>
<artifactId>testDemo2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 引入本地依赖 -->
<dependency>
<groupId>org.test</groupId>
<artifactId>testDemo1</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/testDemo1-1.0-SNAPSHOT-release.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 跳过依赖 -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- 设置打包 jdk -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--正常打包-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<!-- jar 包 主入口方法 指向刚刚写的 test 方法-->
<manifest>
<mainClass>test2</mainClass>
</manifest>
<!-- 打包时加入本地 jar 包-->
<manifestEntries>
<Class-Path>lib/*.jar</Class-Path>
</manifestEntries>
</archive>
<descriptors>
<!--assembly配置文件路径,注意需要在项目中新建文件assembly/release.xml-->
<descriptor>${basedir}/src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
添加测试类
public class test2 {
public static void main(String[] args) {
System.out.println("执行到了 testDemo2 主函数");
new test().test();
}
}
运行 main 函数
可以看到已经成功调用到了 jar 包内的 test 方法
打包及测试
运行
java -jar testDemo2-1.0-SNAPSHOT-release.jar
可以看到,已经成功调用到了 testDemo2 项目的主函数,并且调用了 testDemo1 中的 test 方法,使用了 fastjson 依赖构建 json 并打印