最代码广告位
已注销用户的gravatar头像
已注销用户2016-12-20 11:20:18

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 的结构

Linux shell脚本启动一个jar为什么抛出NoClassDefFoundError的异常?

我就奇怪了,我不是有 pom.xml 怎么就

NoClassDefFoundError了呢?

---------------------------------------------------------------------

比比了这么多,相信你也懵比了,那么有兴趣的同学来看看这个问题吧,你迟早都要遇到的

所有回答列表(5)
最代码官方的gravatar头像
最代码官方 LV1562016年12月20日

应该是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

Linux shell脚本启动一个jar为什么抛出NoClassDefFoundError的异常?

评论(1)最佳答案
已注销用户的gravatar头像
已注销用户 LV342016年12月20日

crying,终于解决了,下面说说我的解决方法,万一能帮到牛牛们呢

前提: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 -->

 

就酱紫,就好了!

具体问为什么,有时间我写成博客分享出来~~~~

你的走走的gravatar头像
你的走走 LV22016年12月21日

可以啊 

薛小沐的gravatar头像
薛小沐 LV22016年12月21日

try{

}catch{}

fffsfesf的gravatar头像
fffsfesf LV22016年12月21日

你重新运行一次啊应该可以

最近浏览
3969138 LV1511月17日
月亮月亮月亮星星星星星星
xuwchen LV15月7日
星星
11784737252月5日
暂无贡献等级
audiporsche LV12019年8月30日
星星
397564528 LV12018年11月27日
星星
月之氏族 LV222018年10月21日
太阳月亮星星星星
foodiedaddy LV12018年9月21日
星星
coding喵 LV162017年11月20日
太阳
li23356852017年11月14日
暂无贡献等级
最不屑一顾是相思 LV192017年9月27日
太阳星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友