Maven学习(在macos m2下使用) 2023-09-30Maven学习(在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安装
brew安装maven
brew install maven
配置环境变量 未配置时会出错
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
在项目中使用 就会打包好项目结果到target目录下面。
执行使用: java -j target/app_maven_test-0.0.1-SNAPSHOT.jar
另外maven还可以查看依赖的次级依赖
可以用来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