项目存在本地jar包依赖,打成jar包部署后出现的问题及解决方法

问题

pom中使用本地jar包依赖,使用idea运行程序正常,打成jar包后使用命令java -jar XXX.jar运行报demo-0.0.1-SNAPSHOT.jar中没有主清单属性。基于这个问题解决后陆续出现打出的jar包没有找到依赖等问题。

修改pom.xml文件

原始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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>1.8</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>
        <skipTests>true</skipTests>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>

        <dependency>
            <groupId>cn.com.zf.mmyy</groupId>
            <artifactId>tna-ist</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/java/com/example/demo/lib/tna-ist-v3.9.jar</systemPath>
        </dependency>


        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.71</version>
        </dependency>

    </dependencies>
    <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>
        <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>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.demo.DemoApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

使用当前pom.xml文件打包后运行报demo-0.0.1-SNAPSHOT.jar中没有主清单属性

解决方法

使用构建工具(Maven 或 Gradle)来构建 JAR 文件

Maven

pom.xml 中配置 maven-jar-plugin 插件,以确保在打包时包含正确的主类信息:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.demo.DemoApplication</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

项目结构如下:

project-root
|-- src
|   |-- main
|       |-- java
|           |-- com
|               |-- example
|                   |-- DemoApplication.java
|-- target
|   |-- demo-0.0.1-SNAPSHOT.jar
|-- pom.xml (for Maven) or build.gradle (for Gradle)
|-- MANIFEST.MF

修改pom.xml文件,使依赖互相兼容

  • Spring Boot Maven 插件的 skip 属性:
    配置了 skip 属性为 true,这可能会导致 Spring Boot Maven 插件的功能被跳过。将其删除或设置为 false。

  • Spring Boot 版本不一致:
    在 properties 部分,定义了 spring-boot.version 为 2.6.13,但在 parent 部分,使用的是 2.7.0。确保两者一致,以避免版本冲突。

  • 将 Gson 版本更新为 2.8.6。

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

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>demo</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.0</spring-boot.version>
        <skipTests>true</skipTests>
    </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>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>

        <dependency>
            <groupId>cn.com.zf.mmyy</groupId>
            <artifactId>tna-ist</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/src/main/java/com/example/demo/lib/tna-ist-v3.9.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.71</version>
        </dependency>
    </dependencies>

    <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>
        <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>
                    <encoding>UTF-8</encoding>
                </configuration>
            </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>
</project>

修改DemoApplication.class

程序部署运行后直接获取某些信息,修改DemoApplication.class使其成功运行后直接调用某方法。

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public CommandLineRunner run() {
        return args -> {
            // 调用你的方法
            yourMethod();
        };
    }

    public void yourMethod() {
        // 你的方法实现
        System.out.println("Method called after JAR startup.");
    }
}

找不到jar包依赖

Exception in thread "main" java.lang.NoClassDefFoundError: cn/com/zf/mmyy/MMYYException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getDeclaredMethod(Unknown Source)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.ClassNotFoundException: cn.com.zf.mmyy.MMYYException
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more

NoClassDefFoundError 是因为在运行时找不到某个类,这通常是由于类路径不正确或 JAR 文件没有包含所有必需的依赖项。在例子中,找不到 cn.com.zf.mmyy.MMYYException 类。

pom.xml 文件中通过 systemPath 引用了一个本地 JAR 文件 tna-ist-v3.9.jar,这个配置可能导致该 JAR 文件未包含在最终的可执行 JAR 文件中。

解决

因为tna-ist-v3.9.jar使用的本地依赖,将此依赖安装到maven中,修改pom.xml文件解决。
命令:mvn install:install-file -Dfile=D:\work\tna-ist-v3.9.jar -DgroupId=cn.com.zf.mmyy -DartifactId=tna-ist -Dversion=3.9 -Dpackaging=jar
pom文件

<dependency>
    <groupId>cn.com.zf.mmyy</groupId>
    <artifactId>tna-ist</artifactId>
    <version>3.9</version>
</dependency>
详细解释:
  • mvn install:install-file:这是Maven的一个目标,用于将一个指定的文件安装到本地仓库中。
  • -Dfile=D:\work\tna-ist-v3.9.jar:指定要安装的JAR文件的路径。在这个例子中,文件位于D:\work\tna-ist-v3.9.jar
  • -DgroupId=cn.com.zf.mmyy:指定这个JAR文件的Group ID,这是一个组织或项目的唯一标识符。通常使用反向域名表示法。
  • -DartifactId=tna-ist:指定这个JAR文件的Artifact ID,这是一个项目的唯一标识符。
  • -Dversion=3.9:指定这个JAR文件的版本号。
  • -Dpackaging=jar:指定这个Artifact的打包类型,在这里是JAR文件。

总结起来,这个命令的作用是将路径为D:\work\tna-ist-v3.9.jar的JAR文件安装到本地Maven仓库中,并将其标识为cn.com.zf.mmyy:tna-ist:3.9

最终pom.xml完整代码

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

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>demo</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>1.8</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>
        <skipTests>true</skipTests>
    </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>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.71</version>
        </dependency>
        <dependency>
            <groupId>cn.com.zf.mmyy</groupId>
            <artifactId>tna-ist</artifactId>
            <version>3.9</version>
        </dependency>

    </dependencies>

    <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>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <requiresUnpack>
                        <requiresUnpack>
                            <groupId>cn.com.zf.mmyy</groupId>
                            <artifactId>tna-ist</artifactId>
                        </requiresUnpack>
                    </requiresUnpack>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

至此该项目可成功打成jar报并可正常运行。

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
dubbo-admin-0.0.1-snapshot.jar 是一个Dubbo框架的管理工具。Dubbo是一种高性能的分布式服务框架,用于构建微服务架构。Dubbo-admin提供了一个图形化界面,用于管理和监控Dubbo框架下的微服务。 dubbo-admin-0.0.1-snapshot.jar 将Dubbo的主要功能封装在一个可执行的JAR文件中,方便安装和部署。它提供了以下几个主要功能: 1. 服务管理:Dubbo-admin可以展示当前Dubbo框架中已注册的所有服务,包括服务的接口、提供者和消费者信息。它可以帮助开发人员和运维人员了解系统中的服务情况,识别问题解决故障。 2. 消费者监控:Dubbo-admin可以实时监控消费者对服务的调用情况,包括调用次数、功率、调用耗时等指标。通过监控消费者行为,可以发现潜在的性能瓶颈和系统故障,并及时采取措施加以解决。 3. 负载均衡:Dubbo-admin提供了负载均衡配置的功能,可以根据不同的负载均衡策略来分配服务请求到不同的提供者。这可以帮助开发人员根据不同的业务需求配置合适的负载均衡策略,提高系统的性能和可靠性。 4. 配置管理:Dubbo-admin可以管理Dubbo框架的各种配置,包括注册中心、协议和服务等。通过配置管理,开发人员可以根据具体需求进行灵活的设置和调整,以满足不同的业务场景。 总的来说,dubbo-admin-0.0.1-snapshot.jar 是一个方便管理和监控Dubbo框架下微服务的工具。它提供了服务管理、消费者监控、负载均衡和配置管理等功能,帮助开发人员和运维人员更好地了解和管理系统的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值