pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决
最近正在迭代开发的一个项目编译安装时出现报“package com.sun.crypto.provider does not exist”的错误,由于本人能力水平有限,也是第一次遇到该问题,来来回回折腾了小半天才解决,故记录下,避免下次再做无用功。
环境:jdk1.7、maven 3.3.0、spring MVC、git、gerrit、sonar等
现象:IDEA里代码没有报错,但是在项目目录下执行mvn install就会报错,提示“package com.sun.crypto.provider does not exist”
问题出现过程:本项目之前为eclipse+svn项目,已稳定运行一年有余,没有问题,最近迁移到git+gerrit+sonar代码检查 环境。代码迁移新环境后,sonar检查报100多个bug,由于出现bug的代码不是本人写的,是同事在网上找的一个开源的方案来修改的,代码检查bug很多无法入库
开源代码地址:https://github.com/haifengl/smile 在此吐槽下这个开源代码,sonar显示110多个bug,大部分都是除数可能为0的问题,甚至还有10几处代码写死为 double a = xxxx/0.0的代码块,而且众多使用该方案的朋友都没有提出问题,整个方案几十上百个类,我看过sonar报错的类,几乎都没有看到有try...catch异常处理的逻辑,不解,为何代码能正常运行
改了60多个bug,后来担心改动多多少少会影响到程序逻辑,既然之前都能运行,干脆就不该,改用将该部分代码打包为jar,引入到工程里,以避开sonar检查的方案。步骤如下:
1、在idea的当前项目下新建一个modual,取名smile(开源代码的包名),将smile相关的代码整个目录复制到该工程中,解决相关的依赖报错等问题后,将该module编译为jar包(具体过程可以百度,有需要后面再单独描述)
2、将smile.jar放入当前项目的lib文件夹下
3、在工程中使用add to buid path(eclipse,idea为再Project Structure里添加libraries)方式引入(问题出在这里,应该使用pom添加依赖引入)
至此成功将smile打成jar包并引入工程。idea不报错,代码没有飘红。然后编译代码打包,报错说smile包的相关代码符号不存在,经过百度后,在pom中编译插件配置里添加如下配置(这也是网上大部分朋友对该问题给出的解决办法)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
再次编译,smile包的问题解决,但是又出现报错“ package com.sun.crypto.provider does not exist”,因为有个DesUtils的工具类用到了com.sun.crypto.provider里的代码。
再次百度,常见的结果如下:
程序包com.sun.crypto.provider不存在的错误 - howard789的博客 - CSDN博客 https://blog.csdn.net/howard789/article/details/80040430 mavne工程运行报错:软件包javax.crypto 不存在解决办法 - wangliutao1的专栏 - CSDN博客 https://blog.csdn.net/wangliutao1/article/details/53997357
maven install 时提示“程序包 javax.crypto不存在” - weixin_34043301的博客 - CSDN博客 https://blog.csdn.net/weixin_34043301/article/details/86228858
....
但都和我的情况有些差别,第一个朋友表示是jdk版本问题,但是我的jdk本来就是1.7的,且在代码里这个报错的包是存在的,代码也没有飘红,点击也可以导航。
按照第二个朋友的方式设置添加bootclasspath配置,可行,但上传到git后,sonar检查不过(提示不能写死路径,不便于协同开发),不允许这种写法。
结果:
经过反复试验,发现,(在我这次的环境下,其他人不一定)只要添加了"<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>"这个配置,就会报这个错。去掉后报smile包找不到。但smile包找不到是因为我使用的add to build path方式引入,导致只是在开发工具中有效,mvn编译时其实是没有引入该包的。
最终办法,将smile包加入到依赖中,去掉extdirs的配置。这样两个问题都不报了。
总结: 问题都是由于自己对maven的经验不足,maven的原理不够理解。导致自己走了半天的冤枉路。
遗留问题:smile包使用本地systemPath方式在pom里添加的依赖,仍然过不了sonar的检查,需要将smile包加入到maven仓库中。
pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决的更多相关文章
- maven 项目pom文件引入lib下的jar包
<dependency> <groupId>abc</groupId> <artifactId>abc</artifactId> <v ...
- Maven使用lib下的包
Maven使用中央仓库的同时,使用lib下的包 pom.xml添加如下配置 <build> <plugins> <plugin> <artifactId> ...
- IDEA导出jar包后运行报错 找不到或无法加载主类
开发工具:IDEA16 运行环境:ubuntu 问题:根据网上的Idea导出jar包的方法,将我的项目导出jar包后运行报错:找不到或无法加载主类. 为了找到这个原因,我重新搭建了一个测试例子,在 ...
- 如何正确在IDEA 里maven构建的项目中引入lib的jar包(图文详解)
不多说,直接上干货! 问题详情 以下是我,maven构建出来的最新spark2.2.0-bin-hadoop2.6的项目. 有些依赖包,maven还是无法一次性满足,所以,得手动加入lib的jar包. ...
- java bulid path 和 WEB-INF/lib 下jar 包区别
用Java Build Path导入包和把包复制到lib下是有区别的,它俩其实不会冲突,也没有什么关系的, Java Build Path是我们编译需要的包, 导入到lib下是程序运行时需要的包 , ...
- 打成Jar包后运行报错 Unable to locate Spring NamespaceHandler for XML schema namespace
MAVEN项目,在IDEA中运行正常,但是把它打成jar包后再运行就会出现异常: Exception in thread "main" org.springframework. ...
- pom.xml引入依赖时顺序错误而编译异常
java.lang.NoClassDefFoundError: Lorg/springframework/beans/factory/access/BeanFactoryReference; at j ...
- xocde7下导入libsqlite3.tbd编译报错的解决办法
在xocde7下没有libsqlite3.dylib,只有libsqlite3.tbd,然后我导入了tbd.编译报错error: /Applications/Xcode.app/Contents/De ...
- RK3399 Android 7.1 删除repo后编译报错
CPU:RK3399 系统:Android 7.1 瑞芯微使用的是 repo 来进行代码管理,但我们需要用 git 来管理,所以就删除了 repo,但是编译就报错,如下:Server is alrea ...
随机推荐
- 请正视抑郁症(附Zung氏抑郁自评量表(SDS))
为什么要记录? 因为去年开始关注抑郁症这块,逐渐发现抑郁症原来不只是简单的情绪问题,它是情绪与实质性的生理相互作用并紧密关联的疾病,并不是单纯的劝解自己就可以疗愈的一种疾病,它的存在需要换着身边的人帮 ...
- vue中的provide/inject讲解
最近在看element-ui的源码,发现了一个这样的属性:inject.遂查看官网provider/inject provider/inject:简单的来说就是在父组件中通过provider来提供变量 ...
- C#里sqlDataAdapter.fill(DataSet,String)的用法
第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 指定后,以后就可以这样调用这张表 DataSe ...
- 前端 CSS的选择器 高级选择器
高级选择器分为: 后代选择器 儿子选择器 并集选择器 交集选择器 后代选择器 使用空格表示后代选择器.父元素的后代(包括儿子,孙子,重孙子) 后代选择器 在CSS中使用非常频繁 因为HTML元素可以嵌 ...
- Java可变参数方法
概念: jdk5.0出现的新特性.将同一个类中,多个方法名相同.参数类型相同.返回类型相同,仅仅是参数个数不同的方法抽取成一个方法,这种方法称为可变参数的方法 好处: 提高代码的重用性和维护性 语法: ...
- ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)
ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...
- [面試題]C符號的優先順序
int x = 0; if (x = 0 || x == 0) printf("%dn", x); printf("%dn", x); 參考C的優先表, 其實就 ...
- 如何在CentOS 7上安装Node.js和npm
Node.js是一个跨平台的JavaScript运行时环境,允许在服务器端执行JavaScript代码.Node.js主要用于后端,但也作为全栈和前端解决方案而流行. npm,Node软件包管理器的缩 ...
- Jquery实例链接
jquery学习笔记 jquery实现全选,反选,取消的操作 左侧菜单收缩的实现(包括,筛选器,addclass.removeclass.绑定事件,链式编程) 模态对话框实现增加删除表格里面的内容 j ...
- WPF绑定并转换
首先新建个项目,我的项目名叫BindConverterDemo,你的话什么都可以,我这里只是做demo 再建两个类,DataDemo,ConverterDemo 这个是DataDemo类 public ...