Linux shell脚本启动一个jar为什么抛出NoClassDefFoundError的异常?
最近,在弄一个鬼玩意,可以说是独立项目之外的一个中间件。
所以,我就独立出来当成一个 jar 来开发。
问题来了,我开发完了,我要放服务器上,我怎么启动这个jar呢。
在windows开发环境中,一般启动一个不是web项目,入门都是main() 方法
=============================== 分割线 ====================================
查询了一番资料,问了一番以前同事,改了几番脚本,如下
export JAVA_HOME=/usr/javak1.8.0_111 JVM_OPTS="-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=512m" #JAVA_OPTIONS=" -hotspot -Xms128m -Xmx512m " logpath='ar/log/ignite' mainclass='com.github.aloxc.ignite.benchmark.IgniteBenchmark' IGNITE_HOME=/opt/webapp/ignite IGNITE_LIBS="${IGNITE_HOME}bs/*" #for file in ${IGNITE_HOME}bs/*jar #do # if [ -d ${file} ] && [ "${file}" != "${IGNITE_HOME}"bs/optional ]; then # IGNITE_LIBS=${IGNITE_LIBS}:${file}/* # fi #done for jar in $IGNITE_LIBS/*.jar do IGNITE_CLASSPATH=$CLASS_PATH':'$jar done export IGNITE_CLASSPATH=$IGNITE_LIBS # start java jar nohup $JAVA_HOME/bin/java $JVM_OPTS -classpath $IGNITE_CLASSPATH $mainclass >${logpath}.log 2>${logpath}.error &
改好启动后 查看log
发现一个问题
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/ignite/Ignition at com.tempus.start.StartIgnite.<clinit>(StartIgnite.java:26) Caused by: java.lang.ClassNotFoundException: org.apache.ignite.Ignition at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more
然后又傻逼呵呵的看了一下 jar 的结构
我就奇怪了,我不是有 pom.xml 怎么就
NoClassDefFoundError了呢?
---------------------------------------------------------------------
比比了这么多,相信你也懵比了,那么有兴趣的同学来看看这个问题吧,你迟早都要遇到的
应该是linux shell运行java程序时,没有找到jar包和class所致,只要设置下-cp就可以,但是如果依赖的jar包太多的话必须要一个个添加,有个极简的办法就是设置文件夹
比如最代码每天更新用户排行的shell脚本
JAVA_HOME=/usr/local/jdk1.7.0_45/ PATH=$JAVA_HOME/bin:$PATH java -Djava.ext.dirs=/data/www/www.zuidaima.com_8081/WEB-INF/lib/ -cp /data/www/www.zuidaima.com_8081/WEB-INF/classes/ com.javaniu.www.crontab.UpdateUserRank
,终于解决了,下面说说我的解决方法,万一能帮到牛牛们呢
前提:maven开发的 jar 中间件(上面好像没有说是 maven 项目)
其实,看到jar反编译后就知道是咋回事了,打出来的是一个jar包,其他的依赖都没有加进来,运行起来肯定是报错的。
而且这么运行这个jar 也是错的
为什么呢?
默认的 pom.xml 你指定的jar 打出来是不可执行的 so ...就会遇到我这样的问题了
那么怎么解决
方法很easy 。。。
在你的 pom.xml添加
<!-- 打包时 生产可运行的jar包 begin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>这里写你的运行的类所在的package+className</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <!-- 打包时 生产可运行的jar包 end -->
就酱紫,就好了!
具体问为什么,有时间我写成博客分享出来~~~~
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?