项目存在本地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报并可正常运行。

相关推荐

  1. SpringBoot jar如何获取jarResouces下文件

    2024-07-09 21:56:07       32 阅读
  2. jar 依赖相关

    2024-07-09 21:56:07       46 阅读
  3. <span style='color:red;'>打</span><span style='color:red;'>jar</span><span style='color:red;'>包</span>

    jar

    2024-07-09 21:56:07      14 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 21:56:07       4 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 21:56:07       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 21:56:07       4 阅读
  4. Python语言-面向对象

    2024-07-09 21:56:07       5 阅读

热门阅读

  1. Kafka 典型问题与排查以及相关优化

    2024-07-09 21:56:07       8 阅读
  2. SQL中字符串类型中char和varchar之间的区别是什么

    2024-07-09 21:56:07       8 阅读
  3. 【框架】ABP(ASP.NET Boilerplate Project)

    2024-07-09 21:56:07       8 阅读
  4. SQL Server集成服务(SSIS):数据集成的瑞士军刀

    2024-07-09 21:56:07       8 阅读
  5. LVS+Keepalived群集

    2024-07-09 21:56:07       9 阅读
  6. 精准控制:Eureka服务续约间隔配置全指南

    2024-07-09 21:56:07       11 阅读
  7. 部署LVS-DR群集

    2024-07-09 21:56:07       12 阅读