使用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. [HNOI2012]永无乡

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  2. C++Primer学习——const

    Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...

  3. ●BZOJ 4310 跳蚤

    ●赘述题目 给出一个字符串,要求分成k个子串,然后求出每个子串的字典序最大的子串(我称它为子子串),要使这k个子子串中的字典序最大的那个串(即魔力串)最小.输出该魔力串. (本题个人感觉很好,比较综合 ...

  4. NOIP 2012

    Prob.1 vigenere密码 模拟代码: #include<cstdio> #include<cstring> #include<iostream> usin ...

  5. hdu5651 xiaoxin juju needs help(逆元)

    xiaoxin juju needs help  Accepts: 150  Submissions: 966  Time Limit: 2000/1000 MS (Java/Others)  Mem ...

  6. Delphi 7中的四种消息框

    Delphi中平常使用的消息框有四种形式,有ShowMessage.MessageDlg.Application.MessageBox.MessageBox.下面来深入了解下这四种形式的实现和使用.1 ...

  7. python 程序中调用go

    虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...

  8. IntelliJ IDEA光标变粗 backspace无法删除内容解决方法

    进入了vim插件 1.ctrl+alt+s快捷键打开Settings 2.选择左侧列表中的Plugins 3.在右侧面板的搜索框中搜索IdeaVim 4.将复选框中的钩子去掉 backspace成了其 ...

  9. 开发网页时,127.0.0.1或者localhost能访问,而本机地址不能访问的解决

    第一 ping试试 127.0.0.1 和 本机地址 若127.0.0.1可以 说明可以自己ping自己 若本机地址可以 说明host正常 第二 检查服务器部署 再部署一个新的 若新的正常 说明你项目 ...

  10. 基于无域故障转移群集 配置高可用SQLServer 2016数据库

    基于上次的文章搭建的环境,可以在这里:http://www.cnblogs.com/DragonStart/p/8275182.html看到上次的文章. 演示环境 1. 配置一览 Key Value ...