maven本地打包依赖无法引用

描述:写了一个RPC的starter包

执行命令后

mvn install

点击引入依赖无反应

手动输入对应的包显示找不到,但是在Maven可以找到

问题在于pom.xml文件,正常打包的maven文件应该可以显示出来,但是由于未删除spring-boot-maven-plugin。

spring-boot-maven-plugin 主要用于 Spring Boot 可执行 JAR(fat jar) 的打包和启动,它会将所有依赖合并到一个 JAR 文件中,并生成 META-INF/MANIFEST.MF,使得 java -jar xxx.jar 可以直接运行。

Spring Boot Starter(即 starter 依赖)只是一个 普通的依赖库(library JAR),它不需要也不应该是 可执行 JAR

原来的pom.xml

<?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">

    <!-- Project Descriptor -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.heartunderblade</groupId>
    <artifactId>starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>heartunderblade-rpc-springboot-starter</name>
    <description>Spring Boot Starter for Heartunderblade RPC</description>

    <!-- Properties Section -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>

    <!-- Dependencies Section -->
    <dependencies>
        <!-- Spring Boot Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Configuration Processor (for @ConfigurationProperties) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Custom Heartunderblade RPC Core -->
        <dependency>
            <groupId>com.heartunderblade.rpc</groupId>
            <artifactId>heartunderblade-rpc-core</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Spring Boot Testing -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- Dependency Management Section -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- Build Section -->
    <build>
        <plugins>
            <!-- Compiler Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- Spring Boot Maven Plugin -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <!-- Repositories (if needed for custom dependencies) -->
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
        <repository>
            <id>snapshot-repo</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

移除后pom.xml

<?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">

    <!-- Project Descriptor -->
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.heartunderblade</groupId>
    <artifactId>starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>heartunderblade-rpc-springboot-starter</name>
    <description>Spring Boot Starter for Heartunderblade RPC</description>

    <!-- Properties Section -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>

    <!-- Dependencies Section -->
    <dependencies>
        <!-- Spring Boot Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Configuration Processor (for @ConfigurationProperties) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Custom Heartunderblade RPC Core -->
        <dependency>
            <groupId>com.heartunderblade.rpc</groupId>
            <artifactId>heartunderblade-rpc-core</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Spring Boot Testing -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- Dependency Management Section -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- Build Section -->
    <build>
        <plugins>
            <!-- Compiler Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- Repositories (if needed for custom dependencies) -->
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo.maven.apache.org/maven2</url>
        </repository>
        <repository>
            <id>snapshot-repo</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

再重新执行mvn install即可成功引入

<think>首先,用户的问题是:“我想查找Maven打包无法找到本地jar的解决方案 请问Maven打包无法找到本地jar的解决办法”。这是在寻求帮助解决Maven构建时找本地JAR的问题。 我从系统级指令中回顾关键点: - 所有行内数学表达式使用$...$格式(但这里可能涉及数学)。 - 独立公式使用$$...$$并单独成段(同样,可能适用)。 - LaTeX语法正确(在代码块中需要正确)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户提供了几个引用: - [^1]:描述需要手动添加本地JAR的情况。 - [^2]:介绍如何在Maven项目中本地JAR。 - [^3]:提到打包本地JAR时的问题。 - [^4]:讨论了导入本地JAR的方式。 - [^5]:提供了导入本地JAR的插件声明方式。 我需要整合这些引用来回答用户的问题。用户的问题是具体关于打包时找本地JAR,所以我应该聚焦在解决方案上。 关键引用: - [^4]提到了普通方式导入JAR:在pom.xml中添加dependency,指定scope为system和systemPath。 - [^5]给出了一个具体例子:<scope>system</scope> and <systemPath>指向本地路径。 - [^3]提到使用assembly-plugin打包时遇到问题。 常见原因和解决方案: 1. **添加本地JAR依赖**:使用<dependency>标签指定scope和systemPath。 2. **打包插件配置**:确保打包插件如maven-assembly-plugin或maven-shade-plugin能本地JAR。 3. **路径问题**:验证systemPath是否正确,使用相对路径(如${project.basedir}/libs/xxx.jar)。 4. **范围问题**:使用<scope>system</scope>。 5. **插件配置**:在打包插件中添加includeSystemScope或其他配置。 从引用中: - [^5]:使用<dependency> with <scope>system</scope> and <systemPath>。 - [^4]:类似方式。 - [^3]:提到assembly-plugin可能需要额外配置。 完整解决方案步骤: 1. 在pom.xml中添加依赖: ```xml <dependency> <groupId>com.example</groupId> <artifactId>example-artifact</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/libs/your-jar-file.jar</systemPath> </dependency> ``` 2. 确保JAR文件位于指定的路径。 3. 如果使用打包插件如maven-assembly-plugin,配置descriptorRef或assembly描述符来含系统范围的依赖。 - 例如,在pom.xml中配置插件: ```xml <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>your.main.Class</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ``` - 或者添加includeSystemScope配置:<includeSystemScope>true</includeSystemScope>在某些插件中。 4. 运行Maven命令:mvn clean install。 其他注意事项: - 对于本地JAR,groupId和artifactId可以是任意的,但要一致。 - 使用相对路径以避免环境依赖。 - 如果在IDE中工作,确保IDE配置正确。 现在,结构回答: - 使用中文回复。 - 结构清晰:先解释问题,然后逐步给出解决方案。 - 引用参考:在相关部分添加引用标识。 - 结束时生成相关问题。 回答结构: 1. 介绍问题:Maven打包时找本地JAR的原因。 2. 解决方案步骤。 3. 代码示例。 4. 注意事项。 5. 生成相关问题。 生成相关问题: - 基于主题,如: 1. 如何避免使用本地JAR的最佳实践? 2. Maven依赖冲突解决的其他方法? 3. 如何在Maven项目中管理自定义JAR? 4. 使用assembly-plugin打包的常见问题? 5. Maven中system scope的优缺点? 确保回答真实可靠:基于提供的引用和一般Maven知识。 最终输出格式: - 文本回答。 - 代码块使用Markdown格式。 - 引用标识如[^1]。 - 结尾有相关问题部分。 </think>### Maven打包时找本地JAR的解决方案 当Maven构建项目时无法找到本地JAR,通常是由于依赖未正确配置或打包插件未含系统范围的依赖所致。这个问题常见于需要本地修改的JAR、非Maven仓库的自定义依赖或解决依赖冲突的场景[^1][^5]。以下是系统化的解决步骤,基于Maven的最佳实践和引用内容。注意:所有操作均在项目根目录的`pom.xml`文件中完成。 #### **步骤1: 添加本地JAR依赖** 在`pom.xml`中,使用`<scope>system</scope>`和`<systemPath>`明确指定本地JAR路径: ```xml <dependency> <groupId>com.example</groupId> <!-- 替换为自定义groupId --> <artifactId>example-artifact</artifactId> <!-- 替换为自定义artifactId --> <version>1.0.0</version> <!-- 替换为实际版本号 --> <scope>system</scope> <systemPath>${project.basedir}/libs/your-jar-file.jar</systemPath> <!-- 替换为JAR文件的实际相对路径 --> </dependency> ``` - **关键点**: - `<scope>system</scope>`:声明依赖本地系统路径而非Maven仓库[^5][^4]。 - `<systemPath>`:使用`${project.basedir}`表示项目根目录的相对路径(例如`libs/xxx.jar`),避免绝对路径带来的环境依赖问题[^2][^5]。 - 确保JAR文件已放置在指定路径下(如`/libs`目录)。 - **为什么有效**:这强制Maven在编译和打包阶段识别本地JAR引用[^4][^5]。 #### **步骤2: 配置打包插件以本地JAR** 如果使用`maven-assembly-plugin`或类似工具打包(如生成可执行JAR或ZIP),需额外配置插件: ```xml <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> <!-- 确保含所有依赖 --> </descriptorRefs> <includeSystemScope>true</includeSystemScope> <!-- 关键: 含system范围的依赖 --> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` - **关键点**: - `<includeSystemScope>true</includeSystemScope>`:确保打包含`system`范围的本地JAR[^3]。 - 如果使用其他插件(如`maven-shade-plugin`),同样添加`<includeSystemScope>true</includeSystemScope>`配置。 - **为什么有效**:默认打包插件可能忽略`system`依赖,此配置强制本地JAR文件以避免“程序存在”错误[^3][^5]。 #### **步骤3: 验证和构建项目** 1. **验证依赖路径**: - 执行 `mvn dependency:resolve` 检查依赖是否被正确识别。 - 错误示例:若提示 `Missing artifact xxx`,请核对`<systemPath>`路径。 2. **清理并重新构建**: ```bash mvn clean package # 重新打包项目 ``` - 打包后检查生成的JAR/ZIP文件(如 `target/*-jar-with-dependencies.jar`),验证本地JAR是否被含。 #### **注意事项** - **本地JAR管理**:优先将自定义JAR部署到私有Maven仓库(如Nexus),避免使用本地路径以减少环境问题[^2][^4]。 - **依赖冲突**:如果多个本地JAR有版本冲突,在`pom.xml`中使用`<exclusions>`或依赖管理解决[^1]。 - **IDE支持**:在IntelliJ或Eclipse中,导入本地JAR后需刷新Maven项目(右键项目 > Maven > Update Project)[^5]。 - **替代方案**:对于临时测试,可使用 `mvn install:install-file` 将本地JAR安装到本地仓库(命令示例:`mvn install:install-file -Dfile=libs/your-jar-file.jar -DgroupId=com.example -DartifactId=example-artifact -Dversion=1.0.0 -Dpackaging=jar`),再在`pom.xml`中以常规依赖引用[^4]。 通过以上步骤,Maven打包时能正确处理本地JAR依赖。如果问题持续,检查控制台错误日志以定位路径错误或插件配置遗漏[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值