cifangyiquan 10 X 10
cifangyiquan:~/blog$ source "Maven学习(在macos m2下使用).sh"

cifangyiquan:~/blog$ printenv
CREATED_DATE = 2023-09-30
UPDATED_DATE = 2023-09-30
TAGS = maven : java : macos m2
CATEGORIES = programming

cifangyiquan:~/blog$ grep -lr $TAGS post
2023-09-30 Maven学习(在macos m2下使用)
Maven学习(在macos m2下使用)

Maven学习(在macos m2下使用)

新公司的项目使用的是JAVA作为开发语言。作为一个C++开发者,需要学习一下JAVA的toolchain。今天快速学习一下JAVA的build工具Maven。

Java安装

项目使用的java17,这里就以java17安装举例。 在linux下安装:

1
2
3
4

# linux

@root# yum install openjdk@17

在macos下安装:

1
$ brew install openjdk@17

配置JAVA_HOME环境变量

在linux下配置到~/.bashrc中

1
2
3
4
5
6
7

# linux

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

在macos下一般配置到~/.zshrc中(根据个人shell决定)

1
2
3
4
5
6
7

# macos

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

maven介绍

Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。

Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

个人感觉:maven是java的项目的管理和构建工具。类似于C++项目的Cmake。下面就以macos环境来示范了。

maven安装

  1. brew安装maven

brew install maven

  1. 配置环境变量 未配置时会出错
1
2
3
(base) [cifangyiquan@] ~ %  mvn -v
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

配置.zshrc

1
2
3
4
5
6
7
8
9
10
11

# java

export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# maven

export M2_HOME=/opt/homebrew/Cellar/maven/3.9.4/libexec
export PATH=$PATH:$M2_HOME/bin

配置后

1
2
3
4
5
6
7
8
(base) [cifangyiquan@] ~ %  mvn -v
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
Maven home: /opt/homebrew/Cellar/maven/3.9.4/libexec

Java version: 1.8.0_381, vendor: Oracle Corporation, runtime: /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "13.4", arch: "aarch64", family: "mac"

maven初体验

pom文件

POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。 POM 中可以指定以下配置:

1
2
3
4
5
6
7
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表
相关邮件列表信息

在创建 POM 之前,我们首先需要描述项目组 (groupId), 项目的唯一ID。 举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/> *<!-- lookup parent from repository -->*
</parent>
<groupId>net.cifangyiquan</groupId>
<artifactId>app_maven_test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>app_maven_test</name>
<description>project for maven test</description>

<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.15</version>
</plugin>

</plugins>

</build>
</project>

类似于Makefile或者cmake的CMakeList。主要规定了java版本,生成目标,项目依赖等信息。pom文件的编写有很多内容,这里主要是构建已有项目,就先不展开了。

maven使用

maven的常用命令有:

1
2
3
4
mvn clean # 清除已构建的环境,类似于make clean
mvn compile # 编译java文件,对所有文件g++ -c
mvn package # 对结果进行打包,编译连接生成目标文件。make
mvn install # 打包安装到本地maven库中,make install

compile,package,install一般会和clean联合使用。联合使用时,命令有顺序关系。如下:

1
2
3
$ mvn clean compile
$ mvn clean package *# 最常用*
$ mvn clean install

在项目中使用

1
$ mvn clean package
就会打包好项目结果到target目录下面。 执行使用: java -j target/app_maven_test-0.0.1-SNAPSHOT.jar 另外maven还可以查看依赖的次级依赖
1
$ mvn dependency:tree
可以用来debug依赖版本的问题。

遇到的一些问题和解决方法

错误1

mac m2芯片依赖问题:

[ERROR] Failed to execute goal on project webpage_search: Could not resolve dependencies for project com.zp:webpage_search:jar:0.0.1-SNAPSHOT: The following artifacts could not be resolved: org.nd4j:nd4j-native:jar:macosx-arm64:1.0.0-beta7 (absent), org.bytedeco:javacpp:jar:macosx-arm64:1.5.3 (absent), org.bytedeco:openblas:jar:macosx-arm64:0.3.9-1-1.5.3 (absent): Could not find artifact org.nd4j:nd4j-native:jar:macosx-arm64:1.0.0-beta7 in aliyunmaven (https://maven.aliyun.com/repository/public) -> [Help 1]

原因:nd4j与M2芯片的兼容问题。需要配置相应的版本。 解决办法: 替换原来的

1
2
3
4
5
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native-platform</artifactId>
<version>1.0.0-beta7</version>
</dependency>

变成下面的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>1.0.0-M2.1</version>
<classifier>macosx-arm64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.21-1.5.8</version>
<classifier>macosx-arm64</classifier>
</dependency>

错误2:

明明安装了JDK,还是出现了No compiler错误。

[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

问题原因:Oracle安装包安装了java和java se。默认使用了第一个。 解决方案:参考这里

1
2
3
4
5
6
7
8
(base) [cifangyiquan@] searchhub %   /usr/libexec/java_home -V
Matching Java Virtual Machines (2):

1.8.381.09 (arm64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

1.8.0_381 (arm64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home

/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

解决办法:删除掉第一个。

(base) [cifangyiquan@] searchhub % sudo mv /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home.bak

build成果:

1
2
3
4
5
6
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 48.952 s
[INFO] Finished at: 2023-09-27T11:22:52+08:00
[INFO] ------------------------------------------------------------------------

参考

  • https://blog.csdn.net/w605283073/article/details/111770386