Jar包运行找不到主类

问题描述

现有 Gradle 项目打包 Jar 的配置如下,Sample 类里有 main 方法。

csharp 复制代码
plugins {
    id 'java'
}

group 'sapmle'
version '1.0'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation'com.azure:azure-identity:1.4.0'
}

jar {

    archivesBaseName = 'sample'
    manifest {
        attributes(
                "Manifest-Version": 1.0,
                'Main-Class': 'Sample'
        )
    }

    // 打包依赖包
    from {
        (configurations.runtimeClasspath).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

}

打包完成后,使用命令 java -jar sample-1.0.jar ​启动报错如下:

makefile 复制代码
C:\Users\Yuhang\Desktop>java -jar sample-1.0.jar
错误: 找不到或无法加载主类 Sample

问题原因

再次检查了所有的配置和文件名,确认无误。

经搜索得知签名证书验证失败也会报出这个错误,使用以下命令验证,证实是证书错误。

makefile 复制代码
C:\Users\Yuhang\Desktop>jarsigner -verify sample-1.0.jar
jarsigner: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

至此找到方向,开始进行详细的确认:

  1. 使用压缩软件打开 jar 包,发现 META_INF 文件夹下有多个同名的 RSA 和 SF 类型文件,经查询得知是证书文件。

  2. 排查项目依赖,发现多个依赖下有同名证书文件:

解决办法

多个证书导致 jar 包运行时无法完成签名验证,我们只需要在打包时排除证书文件即可。

具体修改如下:

csharp 复制代码
jar {

    archivesBaseName = 'sample'
    manifest {
        attributes(
                "Manifest-Version": 1.0,
                'Main-Class': 'Sample'
        )
    }

    // 打包依赖包
    from {
        (configurations.runtimeClasspath).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }

    // 排除各个依赖包的签名文件
    exclude(['META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA'])

}

相关推荐
大模型码小白4 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜4 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码5 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉5 小时前
手撕小汇总
java·前端·javascript
唐青枫5 小时前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
脱胎换骨-军哥6 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫6 小时前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型7 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
风起洛阳@不良使8 小时前
springIOC创建对象的方式--spring容器中的注入
java·spring
zhanghaha13148 小时前
Python语言基础:4_数据类型转换
java·前端·python