使用Eclipse打包jar包,指定了main class。

java -jar mongoCluster.jar

但是运行的时候报ClassNotFoundException NoClassDefFoundError

经查找,由Eclipse自动打包生成MANIFEST.MF不正确,正确的MANIFEST.MF如下

Manifest-Version: 1.0

Main-Class: net.java2000.test.jar.TestJar

Class-Path: spring.jar

lib/commons-logging-1.1.jar

这里特别说明一下

1)在 Class-Path: 后面有一个空格,切记

2)在 Class-Path: 后面写上你的jar 用空格分开

3)MANIFEST有严格的长度限制,如果class-path长了,就必须换行,

切记在上一行末尾一定要有一个空格,下一行的开头一定要有2个空格

4)最后一定要空2行,否则Eclipse打包时有可能把你的Class-Path 给忽略掉

实际上,上面的方法能在某些环境下起到一定作用,但是无法根除。

笔者试过在Windows上面可以找到jar,在Linux上面找不到jar的恶心情况。

stackoverflow上面有人说,其实是不可以把第三方jar打到自己的jar包里面。也不建议这么搞。

百度有如下的解决方法:

1)  使用 java -cp 来设置 classpath 对于 jar来说是无效的,因为根据jar的安全规定,其内部的Class-Path 会起作用,外部的会被屏蔽掉(注意是屏蔽掉,不是覆盖掉)

2) Java自身提供了一个设置classpath的方案,那就是使用命令行参数

-Xbootclasspath:      完全取代基本核心的Java class 搜索路径.

不常用,否则要重新写所有Java 核心class

-Xbootclasspath/a: 后缀在核心class搜索路径后面.常用!!

-Xbootclasspath/p: 前缀在核心class搜索路径前面.不常用,避免

引起不必要的冲突.

语法如下:

(分隔符与classpath参数类似,unix使用:号,windows使用;)

java -Xbootclasspath/a:spring.jar;lib/commons-logging-1.1.jar -jar MyProject.jar

3)当然,你把jar放到 {Java_home}/jre/lib/ext 这个目录下面也是可以的,应为JVM肯定会搜索这个目录。

 
注意,如果要用Eclipse编译jar包,就最好使用export runnable jar file。
使用export jar file会导致ClassNotFoundException的异常或NoClassDefFoundError。
 
最后,本人测试过是可以使用fat jar进行one-jar的打包方式。
其原理就是通过实现一个自定义的classloader来把所有的依赖包,打成一个jar包。
Eclipse上面有插件,但是0.0.31的插件只能支持到Eclipse Indigo版本。
 
最后实验得出
在MANIFEST.MF里面配置的class-path如下:
Class-Path: ./lib/XXX-1.3.jar 
在widows下面,会寻找jar包下的jar包。
/my.jar
  |--XXX-1.3.jar
而在Linux下面,则会按照与jar包处在相同的目录下寻找
/my.jar
/lib
  |--XXX-1.3jar
 
结论是,class-path是有用的,但是不同环境对它的解释也不一样。请慎用。

http://stackoverflow.com/questions/183292/classpath-including-jar-within-a-jar

转至:http://my.oschina.net/dacoolbaby/blog/352942

看了上面的介绍,明白了很多。本人有一个比较笨但行得通的方法:使用eclipse选择export-->runnable jar-->然后选择将依赖的jar包的class文件跟自己的class文件一起打包,这样因为所有需要的class都在同一个jar包中了,就不会出现noClassDedfoundError了。在Windows和Linux环境中都可以使用。

jar包执行报ClassNotFoundException的更多相关文章

  1. NetBeans IDE 7.4 Beta版本build JavaFX时生成的可执行jar包执行时找不到依赖的jar包

    现象,执行时抛出java.lang.ClassNotFoundException异常: Executing E:\secondegg\secondegg-reversi\dist\run8022211 ...

  2. 将项目打成jar包执行 在liunx上执行 java -xx.jar

    一:普通maven java项目 项目目录 pom.xml <?xml version="1.0" encoding="UTF-8"?> <p ...

  3. Dubbo_创建Dubbo服务并在ZooKeeper注册,然后通过Jar包执行

    一.安装ZooKeeper(略) 二.创建Dubbo服务  1.DemoService 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  4. maven仓库有jar包还是报错怎么办?

    出现这种情况通常是jar不能自动下载 一.下载jar包外的其他文件,并放到仓库对应路径下: 点击View All,下载其他文件并放到仓库 二.这样仓库这个对应jar包的文件就齐全了.如果还是报错,请检 ...

  5. Spark2 文件处理和jar包执行

    上传数据文件 mkdir -p data/ml/ hadoop fs -mkdir -p /datafile/wangxiao/ hadoop fs -ls / hadoop fs -put /hom ...

  6. 日志jar包冲突报错:Class path contains multiple SLF4J bindings

    问题现象:tomcat启动卡死,报错日志如下: 十一月 07, 2017 8:35:45 下午 org.apache.catalina.core.ApplicationContext log 信息: ...

  7. 搭建nexus私服,无法下载相关jar包,报错Repository proxy-mode is BLOCKED_AUTO

    在搭建nexus私服的时候,之前没直接用来下载maven的相关插件jar包,一直可以使用, 结果今天要编译hadoop的时候,在linux上新用maven就报错了,无法下载maven的相关插件(如下) ...

  8. spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.

    spring boot用layout ZIP打出来的包能够支持外部classpath,但是当用rar/7zip替换其中的jar后,报下列错误: Unable to open nested entry ...

  9. nexus 私服 拉不了 jar 包,报 Not authorized

    问题: 无法下载导入jar包,idea reload 时 报: Could not transfer artifact com.xxx:parent:pom:1.0-SNAPSHOT from/to ...

随机推荐

  1. 【CODEVS 6384 大米兔学全排列】

    ·大米兔学习全排列,还有一些逆序对,还有一棵二叉索引树.· ·分析:       首先肯定不是像题目上说的那样,使用next_permutation去完成这道题,因为就算是线性的它也不能承受庞大的排列 ...

  2. poj1681 高斯消元

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5352   Accepted: 2588 ...

  3. mycat 1.6 简单的操作实例

    环境: centos7.4 + mysql5.7.20 + mycat1.6单台主机上安装了5台mysql_5.7.20 实例(3306,3307,3308,3309,3310)3306为独立实例 ( ...

  4. I/O控制的主要功能

    主要功能: 1.  解释用户的I/O系统调用.将用户I/O系统调用转换为I/O控制模块认识的命令模式. 2.  设备驱动.根据得到的I/O命令,启动物理设备完成指定的I/O操作. 3.  中断处理.对 ...

  5. JAVA 访问WebRoot下的目录文件

    转自 http://blog.csdn.net/jian_csdn/article/details/46119313 ClassLoader classLoader = Thread.currentT ...

  6. Elasticsearch 学习(一):入门

    一.概念 Elasticsearch 是一个实时分布式搜索和分析引擎.它用于全文搜索.结构化搜索.分析以及将这三者混合使用. 维基百科.英国卫报.StackOverflow.Github 等公司都在使 ...

  7. Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal

    下载 http://tomcat.heanet.ie/native/1.1.12/binaries/win32/tcnative-1.dll将这个文件复制到C:\WINDOWS\system32\,. ...

  8. Hibernate 自动生产表

    hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 今天就来演示一下Hibernate最初级的 ...

  9. 码农代理免费代理ip端口字段js加密破解

    起因 之前挖过爬取免费代理ip的坑,一个比较帅的同事热心发我有免费代理ip的网站,遂研究了下:https://proxy.coderbusy.com/. 解密 因为之前爬过类似的网站有了些经验,大概知 ...

  10. ACM Robot Motion

      机器人已被编程为按照其指令中的路径进行操作.机器人要移动的下一个方向的指令放在网格中.可能的指令是 N north (up the page) S south (down the page) E ...