Jenkins中下载maven构建时出现的错误

一、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

  1. Maven未安装 - Jenkins所在的服务器上没有安装Maven。
  2. 环境变量问题 - 虽然Maven已安装,但PATH环境变量没有正确配置,导致系统找不到mvn命令。
  3. 脚本错误 - 如果你在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文件中的本地仓库地址,可以按照以下步骤操作:

  1. 定位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这样的路径下。

  2. 备份原文件: 在修改之前,最好先备份原始文件,以防万一需要恢复:

    cp settings.xml settings.xml.bak
  3. 编辑settings.xml: 使用文本编辑器打开settings.xml文件,例如使用nanovim:(注意查看权限,权限不足无法修改,在命令前加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

  4. 保存并退出编辑器: 在nano中,按Ctrl+X然后按Y键再按Enter来保存更改。在vim中,按下Esc键后输入:wq然后按Enter键保存并退出。

  5. 验证设置: 修改后,可以使用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

解决方案

有几种方法可以解决这个问题:

  1. 禁用模块化: 如果不想完全利用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的非法访问。

  2. 升级Lombok: 确保正在使用的Lombok版本是最新的,并且支持最新的Java版本。可以通过更新依赖项来实现这一点:

    1<dependency>
    2    <groupId>org.projectlombok</groupId>
    3    <artifactId>lombok</artifactId>
    4    <version>最新版本号</version>
    5    <scope>provided</scope>
    6</dependency>

    可以在Lombok官方网站上查找最新版本号。

  3. 启用模块化支持: 如果打算继续使用模块化特性,可以尝试将Lombok作为一个模块来运行。这意味着需要将Lombok作为一个模块添加到您的模块路径中。这对于非模块化的类库来说较为复杂,通常不推荐这种方法。

  4. 禁用Lombok: 如果项目不需要Lombok的功能,最简单的方法是禁用Lombok,但这显然不是解决问题的最佳途径。

推荐的做法

推荐的做法是更新Lombok到最新版本,并确保Java版本与Lombok兼容。如果问题仍然存在,可以考虑使用第一种方法中的--illegal-access=permit选项来暂时解决编译问题。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值