一、mvn找不到maven指令
FATAL: command execution failed java.io.IOException: error=2, No such file or directory at java.base/java.lang.ProcessImpl.forkAndExec(Native Method) at java.base/java.lang.ProcessImpl.<init>(Unknown Source) at java.base/java.lang.ProcessImpl.start(Unknown Source) Caused: java.io.IOException: Cannot run program "mvn" (in directory "/var/jenkins_home/workspace/lf-club"): error=2, No such file or directory at java.base/java.lang.ProcessBuilder.start(Unknown Source) at java.base/java.lang.ProcessBuilder.start(Unknown Source) at hudson.Proc$LocalProc.<init>(Proc.java:252) at hudson.Proc$LocalProc.<init>(Proc.java:221) at hudson.Launcher$LocalLauncher.launch(Launcher.java:994) at hudson.Launcher$ProcStarter.start(Launcher.java:506) at hudson.Launcher$ProcStarter.join(Launcher.java:517) at hudson.tasks.Maven.perform(Maven.java:368) at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20) at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:818) at hudson.model.Build$BuildExecution.build(Build.java:199) at hudson.model.Build$BuildExecution.doRun(Build.java:164) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:526) at hudson.model.Run.execute(Run.java:1894) at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:44) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:446) Build step 'Invoke top-level Maven targets' marked build as failure Finished: FAILURE
- Maven未安装 - Jenkins所在的服务器上没有安装Maven。
- 环境变量问题 - 虽然Maven已安装,但
PATH
环境变量没有正确配置,导致系统找不到mvn
命令。 - 脚本错误 - 如果你在Jenkins的任务中直接调用了Maven命令,可能是因为脚本中的路径或命令名称有误。
针对这些问题,你可以按照以下步骤进行排查和解决:
解决方法
1. 检查Maven是否已安装
首先确认Maven是否已正确安装在服务器上。你可以通过SSH登录到服务器并运行以下命令来检查Maven是否可用:
mvn -version
如果命令不可用或者返回错误,那么你需要安装Maven。对于Debian/Ubuntu系统,你可以使用以下命令安装Maven:
sudo apt-get update
sudo apt-get install maven
对于CentOS/RHEL系统,可以使用:
sudo yum install maven
2. 配置环境变量
确保Maven的可执行文件路径已经被添加到了PATH
环境变量中。通常情况下,Maven的安装会自动更新PATH
,但如果未成功,你可以手动更新它。对于Linux系统,可以在~/.bashrc
或/etc/environment
文件中添加如下行:
export PATH=/path/to/maven/bin:$PATH
替换/path/to/maven/bin
为实际的Maven二进制文件路径。
3. 检查Jenkins配置
确保在Jenkins中使用的构建步骤中正确地指定了Maven的路径。如果Jenkins是通过插件来管理Maven的,确保插件已正确配置Maven的安装位置。
首先进入自己构建的Item中,点击Configuration,下拉找到Build Steps,选择调用顶层 Maven 目标,配置maven
打开Manage Jenkins,点击Tools修改Maven配置
再次执行Item。
二、权限不足
解决方案
修改Maven文件权限:首先,你需要确保Jenkins用户能够执行Maven的二进制文件。可以通过给Maven的可执行文件添加执行权限来实现。在服务器上执行以下命令:
sudo chmod +x /var/jenkins_home/apache-maven-3.9.8/bin/mvn
这条命令会给Maven的主执行文件mvn添加执行权限。
检查目录权限:除了确保Maven本身可执行外,还需确认Jenkins有权限访问相关的项目目录。如果有必要,可以调整/var/jenkins_home/workspace/及其子目录的权限,确保Jenkins用户有足够的读写权限。但请谨慎操作,避免给整个系统带来安全风险。
例如,可以使用如下命令给Jenkins工作空间目录及其内容赋予适当的权限(这里假设Jenkins运行在一个名为jenkins的用户下):
sudo chown -R jenkins:jenkins /var/jenkins_home/workspace/
Jenkins配置:如果你的Jenkins是以服务的形式运行,确保该服务所使用的用户(如jenkins)与你修改权限时所针对的用户一致。在某些系统中,你可能需要通过系统服务管理工具(如systemctl)来调整Jenkins服务的用户或组。
检查并修改(如果需要)Jenkins服务用户可以通过编辑服务配置文件实现,例如:
sudo nano /etc/systemd/system/jenkins.service
然后在 [Service] 部分,确保有类似 User=jenkins 和 Group=jenkins 的设置,并重启Jenkins服务使更改生效:
sudo systemctl daemon-reload
sudo systemctl restart jenkins
完成以上步骤后,重新尝试在Jenkins中执行构建任务,看是否解决了“Permission denied”的问题。
三、Linux中maven conf中settings.xml的本地仓库出错
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/CategoryTypeEnum.java:[3,14] package lombok does not exist
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/CategoryTypeEnum.java:[11,2] cannot find symbol
symbol: class Getter
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/IsDeletedFlagEnum.java:[3,14] package lombok does not exist
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/IsDeletedFlagEnum.java:[11,2] cannot find symbol
symbol: class Getter
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/entity/PageResult.java:[3,14] package lombok does not exist
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/entity/PageResult.java:[15,2] cannot find symbol
symbol: class Data
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/SubjectInfoTypeEnum.java:[3,14] package lombok does not exist
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/enums/SubjectInfoTypeEnum.java:[11,2] cannot find symbol
symbol: class Getter
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/entity/Result.java:[4,14] package lombok does not exist
[ERROR] /var/jenkins_home/workspace/jc-club-subject/jc-club-subject/jc-club-common/src/main/java/com/jcclub/subject/common/entity/Result.java:[6,2] cannot find symbol
symbol: class Data
修改jenkins_home目录下maven配置文件settings.xml中本地仓库地址
<localRepository>/var/jenkins_home/apache-maven-3.9.8/repository</localRepository>
要在Linux系统中修改Maven的settings.xml
文件中的本地仓库地址,可以按照以下步骤操作:
-
定位settings.xml文件: Maven的
settings.xml
文件通常位于Maven安装目录下的conf
目录中。可以使用以下命令来查找该文件的位置:find / -name settings.xml
或者,如果知道Maven的安装路径,可以直接导航到那里:
cd /path/to/maven/conf
默认情况下,Maven的
settings.xml
文件可能位于/usr/share/maven/conf
或/opt/maven/conf
这样的路径下。 -
备份原文件: 在修改之前,最好先备份原始文件,以防万一需要恢复:
cp settings.xml settings.xml.bak
-
编辑settings.xml: 使用文本编辑器打开
settings.xml
文件,例如使用nano
或vim
:(注意查看权限,权限不足无法修改,在命令前加sudo即可)nano settings.xml
或者
vim settings.xml
查找
localRepository
部分,并修改<localRepository>
标签内的路径。例如,如果想将本地仓库移动到/home/user/repository
,修改如下:1<settings> 2 ... 3 <localRepository>/home/user/repository</localRepository> 4 ... 5</settings>
如果
settings.xml
文件中没有显式地指定localRepository
,则默认值通常是用户的主目录下的.m2
目录,即~/.m2/repository
。 -
保存并退出编辑器: 在
nano
中,按Ctrl+X
然后按Y
键再按Enter
来保存更改。在vim
中,按下Esc
键后输入:wq
然后按Enter
键保存并退出。 -
验证设置: 修改后,可以使用
mvn help:effective-settings
命令来验证Maven是否正确加载了新的设置:mvn help:effective-settings
这个命令会显示实际生效的
settings.xml
内容,包括刚刚修改的本地仓库路径。
四、 Lombok和Java模块化之间的兼容性问题
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project lf-club-common: Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x21ce2e4d) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x21ce2e4d -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException [ERROR] [ERROR] After correcting the problems, you can resume the build with the command [ERROR] mvn <args> -rf :lf-club-common
解决方案
有几种方法可以解决这个问题:
-
禁用模块化: 如果不想完全利用Java模块化特性,可以在启动Java编译器时禁用模块化支持。这可以通过在
pom.xml
中添加以下配置来实现:1<build> 2 <plugins> 3 <plugin> 4 <groupId>org.apache.maven.plugins</groupId> 5 <artifactId>maven-compiler-plugin</artifactId> 6 <version>3.13.0</version> 7 <configuration> 8 <release>8</release> 9 <compilerArgs> 10 <arg>--illegal-access=permit</arg> 11 </compilerArgs> 12 </configuration> 13 </plugin> 14 </plugins> 15</build>
这里使用
--illegal-access=permit
来允许对JavacProcessingEnvironment
的非法访问。 -
升级Lombok: 确保正在使用的Lombok版本是最新的,并且支持最新的Java版本。可以通过更新依赖项来实现这一点:
1<dependency> 2 <groupId>org.projectlombok</groupId> 3 <artifactId>lombok</artifactId> 4 <version>最新版本号</version> 5 <scope>provided</scope> 6</dependency>
可以在Lombok官方网站上查找最新版本号。
-
启用模块化支持: 如果打算继续使用模块化特性,可以尝试将Lombok作为一个模块来运行。这意味着需要将Lombok作为一个模块添加到您的模块路径中。这对于非模块化的类库来说较为复杂,通常不推荐这种方法。
-
禁用Lombok: 如果项目不需要Lombok的功能,最简单的方法是禁用Lombok,但这显然不是解决问题的最佳途径。
推荐的做法
推荐的做法是更新Lombok到最新版本,并确保Java版本与Lombok兼容。如果问题仍然存在,可以考虑使用第一种方法中的--illegal-access=permit
选项来暂时解决编译问题。