IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

前言:

最近,遇到了一个问题,都快把我整疯了;这个问题开始是由 使用IDEA 对 非Maven项目进行打 Jar 包 引起的;本来就是想简简单单的打个 jar 包,并将使用的第三方依赖 jar 包打进去,但是问题就出现在了项目中依赖的第三方 jar 包( bcprov-jdk15on-1.54.jar )存在签名,那在打包过程中会把 签名 破坏掉,导致在使用打好的jar包时报错: JCE cannot authenticate the provider BC 。

注意:如果依赖的第三方jar包不存在签名的话,直接按照下面的 打包方式 就能成功打包;

IDEA打jar包:

使用 IDEA 将项目打成jar包,并将使用的第三方依赖jar包打进去;

1、首先看下打包的项目工程:

2、具体的打包流程:2.1、首先配置 MANIFEST.MF

首先需要配置 MANIFEST.MF , 因为这会在打包时使用的;

首先新建一个文件夹,文件夹取名为 META-INF , 在文件夹META-INF中创建文件,取名为 MANIFEST.MF ,然后需要配置下 MANIFEST.MF 文件的内容; 内容如下:

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar lib/bcprov-jdk15on-1.54.jar
Main-Class: com.lyl.Test.PackageTest

注意上面 MANIFEST.MF 配置文件中的内容在填写时,需要注意几点:

1、Class-Path 在 冒号后面需要有 一个空格 ;然后后面跟随的每个依赖包之间也必须有 一个空格 ,并且最后一个依赖后面也必须要存在 一个空格

2、Main-Class这一行后面需要跟 两个空行 ;

最后简单说下,MANIFEST.MF 在打包时起到什么作用呢:

Main-Class 指定程序的运行入口,这样可以直接用java -jar xxx.jar来运行程序。

Class-Path 指定依赖jar包的路径,class loader类加载器会依据这个路径来搜索依赖的class。

2.2、具体配置过程

下面将进行打包前的一些配置,需要将这些配置好后,才能进行打包的;

(1)、

(2)、

(3)、

(4)、

(5)、

(6)、

(7)、

(8)、

2.3、进行打包

上面将打包前的一些配置完成后,最后就可以直接进行打包了;

(1)、

(2)、

end, IDEA 打jar包流程已经完成了;但是打好的jar包,直接使用时,可能还会存在问题,再聊聊会出现的问题。

扩展: 如果想在打jar包时,将依赖的第三包jar包打进去的话,使用IDEA可能会比较繁琐,但是使用 Eclipse 会比较方便快捷,直接使用 Eclipse 的 fat jar 插件 进行打包,十分方便的。

3、打好的jar包在使用时可能存在的问题:3.1、报错:Invalid signature file digest for Manifest main attributes

将打好的jar包引用到另一个项目中,可能会报错:Invalid signature file digest for Manifest main attributes ;

这就是因为 打好的jar包中 存在多余的.SF文件,可以将jar包中后缀为 .SF文件删除就可以了。

3.2、报错:JCE cannot authenticate the provider BC

在项目中使用打好的jar包,可能会报错:JCE cannot authenticate the provider BC ;

这是因为 之前打包时,项目中依赖的第三方jar包中有存在 签名 的jar包(bcprov-jdk15on-1.54.jar);在将其打进jar包时,就会将签名破坏掉,导致在使用这个签名被破坏的包中的类时,就会报错了。

3.3、解决方案:3.3.1、将签名包放一份到本地JDK中(不推荐)

此方案需要将签名包(bcprov-jdk15on-1.54.jar)放到 JDK 中的 jre 中的lib文件夹下的 ext 文件夹中;

例如:本地安装的JDK路径为 E:\Java\jdk1.8.0_60\jre\lib\ext ; 将签名包放到这里一份 。

但是此解决方案不推荐,为什么不推荐呢?

因为如果你打的jar包需要提供给别人的话,别人为了使用你的jar包,还需要改变自己的JDK,这个不太方便了。

3.3.2、打包时,不讲依赖签名包打进去(推荐)

打包时,不将签名包打进去。打好包后,在项目中使用时,需要将依赖的签名包与打好的包一起放到 lib 文件夹下,这样在使用签名包时,就会使用与 打好的包在同级别下的 依赖的签名包。

使用这种方案进行解决时,会比第一种方案方便很多,只是使用时,除了引入打好的jar包外,还需哟再引入下使用到的签名包( bcprov-jdk15on-1.54.jar ),并将其放到同一级别目录下 即可。

打包时,不将签名包打进去的实现步骤:(以 bcprov-jdk15on-1.54.jar 签名包为例子)

(1)、首先是将 MANIFEST.MF 配置文件进行修改:

之前:存在签名包的

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar lib/bcprov-jdk15on-1.54.jar
Main-Class: com.lyl.Test.PackageTest

修改:就是将签名包 bcprov-jdk15on-1.54.jar 的依赖引入删除

Manifest-Version: 1.0
Class-Path: lib/log4j-core-2.0-rc1.jar
Main-Class: com.lyl.Test.PackageTest

(2)、改完 配置文件后,再修改上面打包 具体配置步骤 中的 第(7) 中的引入依赖jar包,将签名包删除,然后再点击OK,并重新打包 即可。如下图:

之前,签名包也引入了:

之后,去掉引入的签名包:

重新打好的包,由于没有将依赖的签名包打进去,那么如果使用到签名包bcprov-jdk15on-1.54.jar的类时,就会报《 类找不到 》怎么办呢?

可以将打好的jar包 “ packagetest-1.0.0.jar ”, 与 签名包 bcprov-jdk15on-1.54.jar 放到引用的项目的 lib 文件夹下(需要保证这两个jar包在项目中的存放的位置在同一级别 即可); 然后在使用时就会使用 外部引用的 依赖签名包中的类了,不会报 类找不到

并且没有破坏签名包的签名,所以也不会报签名被破坏的错了:JCE cannot authenticate the provider BC

end, 暂时只找到了这两种解决方案,感觉这都不是最优的解决方案,但是实在找不到了,唉,如果有知道的朋友,可以告诉下吗? 谢谢啦!

到此这篇关于IDEA对使用了第三方依赖jar包的非Maven项目打jar包的文章就介绍到这了,更多相关idea 第三方依赖jar包非Maven项目打jar包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • IDEA引MAVEN项目jar包依赖导入问题解决方法

    IDEA内置了Maven环境,默认采用Maven解决项目依赖问题.在新建项目后,项目的路径中会生成pom.xml文件和项目名.iml文件.新建项目后,IDEA不会自动刷新Maven的依赖.以Spring Application为例,新建项目编译时提示以下错误信息: 刷新Maven配置的方法为: (1)右键单击项目: (2)在弹出菜单中选择Maven|Reimport菜单项. 此时,IDEA将通过网络自动下载相关依赖,并存放在Maven的本地仓库中.另外,可以将Maven的刷新设置为自动,配置方法

  • IDEA 重新导入依赖maven 命令 reimport的方法

    Intellj 的自动载入maven功能有时候很好用,但是有时候会碰到很多问题,导致pom文件修改却没有触发自动重写载入.此时需要手动强制更新依赖: 1. 手动删除Project Setting 里面的libraries 包 2. 在Maven Project点击clean功能,删除之前编译过得文件 3. 项目右键 --> maven --> Reimport 总结 到此这篇关于IDEA 重新导入依赖maven 命令 reimport的文章就介绍到这了,更多相关idea maven 命令 re

  • 详解IDEA多module项目maven依赖的一些说明

    不管eclipse有没有被被时代抛弃,反正是被我抛弃了,因为IDEA是真的好用 现在公司的项目基本都是基于maven的多module项目,controller,service,model,dao等都被分成了不同的module,这样做当然也是为了解耦. 这些module可根据需要在pom.xml配置来打成war包或者jar包 <packaging>jar</packaging> web主项目设置packaging级别为war,dao.model这些module设置packaging级

  • idea2020.1无法自动加载maven依赖的jar包问题及解决方法

    解决方法:maven的配置文件 <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> 然后在idea的setting中配置如下的参数: -Dmaven.wagon.ht

  • IDEA中Maven依赖下载失败的完美解决方案

    使用IDEA进行Maven项目开发时,时不时会遇到pom.xml报错的情况,其中很大概率是因为Maven依赖的jar包下载失败,找来找去也没有找到是什么问题,困扰了很多程序猿,这里给出IDEA中Maven依赖下载失败解决方案,给大家参考,实测有用. 文章目录首先检查网络有没有问题,确定网络没有问题,请看下一步多次点击重新导入Maven依赖的按钮设置自动导入Maven依赖在IDEA中找到Maven的配置文件的地址,然后检查配置的远程仓库或者镜像有没有问题如果上面几步都没有解决问题,可以使用以下脚本

  • 解决IntelliJ IDEA maven库下载依赖包速度慢的问题

    在pom.xml中添加maven 依赖包时,我就发现不管是否用了翻墙,下载速度都好慢,就1M的东西能下半天,很是苦恼,于是到网上搜资料,然后让我查到了.说是使用阿里的maven镜像就可以了.我于是亲自试了下,速度快的飞起!!! 右键项目选中maven选项,然后选择"open settings.xml"或者 "create settings.xml",然后把如下代码粘贴进去就可以了.重启IDE,感受速度飞起来的感觉吧!!! <?xml version="

  • Intellij IDEA中如何查看maven项目中所有jar包的依赖关系图

    Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有: 第一个按钮:Reimport All Maven Projects 表示根据 pom.xml 重新载入项目.一般单我们在 pom.xml 添加了依赖包或是插件的时候,发现标注 4 的依赖区中没有看到最新写的依赖的话,可以尝试点击此按钮进行项目的重新载入. 第六个按钮:Execute Maven Goal 弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通

  • IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    先如今idea中的spring项目,springBoot的项目的开发一般都是基于maven创建的项目.这大大简化我我们对于各种依赖包的管理,同时又使得各种依赖包方便管理.但是当maven中的依赖下载出现问题的时候也是很头痛. 问题场景 在公司的项目中用到了fastjson依赖,而依赖的版本是动态获取的,如图 但是在某天启动项目的时候报错,一查看原来是maven中fastjson依赖的原因, 这时大部分的人的操作应该和我一样: 操作1 点击maven的更新按钮,让maven自动下载对应的jar包到

  • IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

    前言: 最近,遇到了一个问题,都快把我整疯了:这个问题开始是由 使用IDEA 对 非Maven项目进行打 Jar 包 引起的:本来就是想简简单单的打个 jar 包,并将使用的第三方依赖 jar 包打进去,但是问题就出现在了项目中依赖的第三方 jar 包( bcprov-jdk15on-1.54.jar )存在签名,那在打包过程中会把 签名 破坏掉,导致在使用打好的jar包时报错: JCE cannot authenticate the provider BC . 注意:如果依赖的第三方jar包不

  • 详解IDEA中MAVEN项目打JAR包的简单方法

    Idea中为一般的非Web项目打Jar包是有自己的方法的,网上一搜就能查到很多. 但是如果是为Maven项目打Jar包,其实是很简单的,因为maven本身就有打Jar包的命令. 最简单的方法 首先是在maven项目的pom.xml中添加打包的插件,这里有很多种方式的.最最简单的就是只使用maven-compiler-plugin.maven-jar-plugin插件,并且指定程序入口<mainClass>.相关代码如下: pom.xml文件为: <?xml version="1

  • Java中Maven项目导出jar包配置的示例代码

    具体代码如下所示: <!-- 第一种打包方式 (maven-jar-plugin), 将依赖包和配置文件放到jar包外 --> <build> <sourceDirectory>src/main/java</sourceDirectory> <resources> <resource> <directory>src/main/resources</directory> <!-- 将<director

  • 解决idea导入maven项目缺少jar包的问题

    之前一直用的elipse,现在用idea不熟悉,这里记录一下.这里以idea2017为例. 导入elipse的maven项目,提示缺少jar包,肯定是idea没有给你导包. 第一步,首先确认自己的idea和maven的环境有没有配置好. 第二步,确认自己导项目时候的Module设置. 搞定自己的maven配置之后,咱们再来看一下项目的Module设置问题. 删掉之前Module,重新再导一遍. 点击 + 之后选择项目的本地路径,然后在弹出来的界面中选择Maven,之后一路 Next ,最后点击A

  • SpringBoot工程搭建打包、启动jar包和war包的教程图文详解

    工程搭建 1.File->new->project: 2.选择"Spring Initializr",点击next:(jdk1.8默认即可) 3.完善项目信息,组名可不做修改,项目名可做修改:最终建的项目名为:test,src->main->java下包名会是:com->example->test:点击next: 4.Web下勾选Spring Web Start,(网上创建springboot项目多是勾选Web选项,而较高版本的Springboot没

  • Eclipse将Maven项目打成jar包的方法

    利用Eclipse将项目打包成jar,放入服务器执行. 1:在eclipse中选中项目,右键,Run As,Run Configurations,输入package,然后点击run执行. 2:在eclipse控制台会显示打jar的日志信息,当看到BUILD SUCCESS,代表打包成功. 3:将jar包发布到服务器 首先将middleware-0.0.1-SNAPSHOT.jar包上传到服务器任意目录,然后查看改jar包是否正在执行. ps -ef|grep java 如果存在,则执行 kill

  • SpringBoot中maven项目打成war包部署在liunx服务器上的方法

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动启动类就可以建立独立的Spring应用程序.Spring Boot部署在服务器上主要分为两种方式:一是打成jar包发布,二是打成war包发布,第一种方式只需要在该服务器中运行java -jar+部署项目的名称就可以启动(不要忘了.jar后缀名),操作比较简单,第二种方式操作比较复杂一点,并且是项目发

  • SpringBoot中maven项目打成war包部署在linux服务器上的方法

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动启动类就可以建立独立的Spring应用程序.Spring Boot部署在服务器上主要分为两种方式:一是打成jar包发布,二是打成war包发布,第一种方式只需要在该服务器中运行java -jar+部署项目的名称就可以启动(不要忘了.jar后缀名),操作比较简单,第二种方式操作比较复杂一点,并且是项目发

  • Maven 项目生成jar运行时提示“没有主清单属性”

    新建了一个Maven的项目,mvn compile和mvn package后生成了jar文件,然后直接到target目录下去执行java -jar xxx.jar命令运行jar包时出现了"xxx.jar没有主清单属性"的错误提示. 根据我的经验,肯定是没有找到入口类(即main函数所在的类),在pom.xml里面加上入口类的配置就好了!第一次直接用maven来打包jar,记录一下. 修改pom.xml文件,添加如下配置项即可: <build> <plugins>

  • springboot maven 项目打包jar 最后名称自定义的教程

    maven 文件打包,输入 :package -Dmaven.test.skip=true 进行打包, 一般生成的jar 文件 名称是项目名+版本号这样的 如何在pom.xml 中加入finalname 属性,就可以获得稳定的jar 名称 <build> <finalName>pay</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId

随机推荐