项目编译失败:显示程序包不存在

本文讲述了在开发过程中遇到的Maven编译通过但IDEA编译失败的问题,涉及模块引用、spring-boot-maven-plugin插件影响、以及如何调整IDEA和Maven的构建流程。解决方法包括安装依赖、配置插件、刷新和重启IDEA等。


问题

本地项目中有有 2 个模块 A 和 B,模块 A 引用了 模块 B;但是当运行模块 A 时(有时不是运行时报错,而是使用 maven 打包时报错),却在编译阶段报错:xxx程序包不存在,这里的程序包指模块 A 中使用的 模块 B 的代码所在的包。

解决

1. install到本地仓库

模块 A 引用了 模块 B,那么被依赖的模块(即 模块 B)一定要先执行 mvn install 命令(在 A 引用 B 之前),mvn install 命令会将 模块 B 打包并安装到本地仓库,这样模块 A 引用 模块 B 时才能在本地仓库中找到对应的依赖包。

执行 install 后,模块 A 就可以引入 模块 B,引入时请确保 B 的 maven 坐标正确无误。

1.1 插件问题

如果模块中引入了 spring-boot-maven-plugin 插件,那么引用该模块就可能出现 xxx程序包不存在 的问题。

(1)插件介绍

spring-boot-maven-plugin 插件 应该都不陌生,在我们使用 idea 的 Spring Initializr 新建 Spring Boot 项目时,就会帮我们自动引入,如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

该插件的主要作用是,将 Spring Boot 项目打包生成一个可执行的 jar 包

如果项目中使用了该插件,当使用 maven 对项目打包时,就会将依赖的 jar 包全都打包进去,即生成的 jar 包 包含了需要的所有依赖,可以直接启动运行

当我们引用该可执行 jar 包时,就可能出现问题。

(2)问题解决

那么,该如何解决 使用该插件后,模块引用出现 xxx程序包不存在 的问题呢?

第一种做法

最简单的做法就是 在 pom.xml 中直接去掉该插件的配置。

第二种做法

将插件的配置修改为如下的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

这样配置的效果是,通过设置 <skip>true</skip>,在使用 mvn install 打包时,将会跳过执行插件相关的功能

第二种做法特别适用于 父子项目 的场景:

父项目中使用了 spring-boot-maven-plugin 插件,父项目的某个子项目作为依赖给其他子项目使用(子项目会继承父项目的插件配置,即子项目中也使用了插件),该子项目中就应该设置上方的插件配置(打包时跳过执行插件的功能),以确保生成的依赖被其他项目引用时不会出现问题。

1.2 修改后要重新install

如果被依赖的模块有修改,记得一定要将其重新 执行 install 命令;同时,引入依赖的模块可以刷新下 maven;这样就确保了引入的依赖是最新的。

2. maven编译通过,idea编译失败

之前遇到一种情况,就是 maven 执行 compile、package、install 等操作都没问题,其中都有 maven 的编译操作,因此也即 maven 编译能够通过;但是 当 执行 idea 的 Build 编译时(idea 上方的绿色小锤子,项目启动前也会执行),却报 xxx程序包不存在 的错误。

因为 maven 编译 和 idea 编译 的环境不同,所以怀疑是 idea 编译器的问题,那么该如何解决呢,莫非要我自己手写一个 IDE?(bushi)

解决方法就是:将 idea 的 构建/运行 操作 委托给 maven。具体见下图:

在这里插入图片描述

3. mvn idea:idea

有一种解决方法就是,在项目的根目录下 执行 mvn idea:idea 命令(该命令用于生成 idea 项目文件),执行后会生成两个 .ipr.iws 后缀的两个文件。

在这里插入图片描述

4. 刷新、重启

如果已经正确 install 并且引入,而且上述方案都试过了,还是报 xxx程序包不存在,那么就只剩下最后的这些方法了。

可以先刷新一下项目的 maven,不行的话就执行一下 mvn clean package 重新打一下包。

还是不行的话,就重启大法吧:清空 idea 缓存并重启(具体见下图操作),重启电脑。

清空 idea 缓存并重启:


如果有帮助的话,可以点个赞支持一下嘛🙏

### Maven 依赖下载成功但提示程序包存在的解决方法 在 Maven 构建过程中,即使依赖成功下载,也可能出现“程序包存在”的错误。这通常是因为 Maven 编译阶段使用的 classpath 中未正确包含所需的依赖包,而 IDE 中可能已经通过额外配置包含了这些依赖。例如,在某些项目中,`com.sun.istack.internal` 包可能存在于 `${MAVEN_HOME}/jre/lib/rt.jar` 中,但 Maven 编译器插件并未自动将其加入编译 classpath 中[^1]。 #### 1. 确保依赖作用域配置正确 Maven同作用域(`compile`、`provided`、`runtime`、`test`)会影响依赖是否被包含在构建过程中。若依赖被标记为 `provided`,则 Maven 会认为运行环境已提供该依赖,会将其打包进最终的 JAR 文件中。例如: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> ``` 这种配置可能导致编译时可用,但运行时报错“程序包存在”。应根据实际需求调整作用域配置。 #### 2. 检查依赖是否被正确解析 执行以下命令强制更新依赖并重新解析: ```bash mvn dependency:resolve -U ``` 该命令会强制 Maven 忽略本地缓存并从远程仓库重新下载依赖,适用于解决依赖未正确下载或版本冲突的问题。 #### 3. 清理本地 Maven 仓库 如果依赖已下载但仍然提示程序包存在,可能是本地仓库中依赖损坏或版本一致。可手动删除本地仓库中对应的依赖目录,然后重新构建项目: ```bash rm -rf ~/.m2/repository/com/example/artifact mvn clean install ``` 该操作会清除本地缓存并重新下载依赖,有助于解决依赖解析失败的问题。 #### 4. 配置 Maven 编译器插件 在 `pom.xml` 中配置 Maven 编译器插件,确保编译时 classpath 包含所有依赖: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <includes> <include>**/com/example/**/*.java</include> </includes> </configuration> </plugin> </plugins> </build> ``` 该配置可确保编译器插件正确识别依赖路径并包含所有需要的类。 #### 5. 使用 `mvn dependency:build-classpath` 验证依赖路径 执行以下命令查看当前项目的依赖 classpath: ```bash mvn dependency:build-classpath ``` 该命令会输出所有依赖的路径,可用于验证是否包含所需的 JAR 文件。 #### 6. 使用 `mvn install:install-file` 手动安装缺失的依赖 如果某个依赖未在远程仓库中找到,或本地仓库损坏,可以手动安装 JAR 文件到本地仓库: ```bash mvn install:install-file -Dfile=path/to/your.jar -DgroupId=com.example -DartifactId=demo -Dversion=1.0.0 -Dpackaging=jar ``` 该方式适用于本地已有 JAR 文件但未通过 Maven 管理的情况。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值