使用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. [BZOJ]4908: [BeiJing2017]开车

    Time Limit: 30 Sec  Memory Limit: 256 MB Description 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ...

  2. hdu 5439(找规律)

    The sequence is generated by the following scheme. 1. First, write down 1, 2 on a paper. 2. The 2nd ...

  3. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. Python3 中 random模块

    Python中的random模块用于生成随机数. 下面具体介绍random模块的功能: 1.random.random() #用于生成一个0到1的 随机浮点数:0<= n < 1.0 im ...

  5. 【实用】【移动端】Retain屏1px解决方案

    新浪微博HTML5版 微博的实现方式(rem + 小数px) <meta name="viewport" content="width=device-width,i ...

  6. 好用的jquery.animateNumber.js数字动画插件

    在做公司的运营报告页面时,有一个数字累计增加的动画效果,一开始,毫无头绪,不知如何下手,于是上网查资料,发现大多都是用的插件来实现的,那么今天,我也来用插件jquery.animateNumber.j ...

  7. 优化Webpack打包速度

    1. Webpack 可以配置 externals 来将依赖的库指向全局变量,从而不再打包这个库,比如对于这样一个文件:   import React from 'react'; console.lo ...

  8. java-反射深度剖析

    Java反射是Java语言一个很重要的特征,简单剖析下反射的定义.原理.使用.性能及应用场景. (一)定义 程序运行时,允许改动程序结构或变量类型,这种语言称为动态语言.java不属于动态语言,但提供 ...

  9. mongoose多条件模糊查询实例

    mongoose多条件模糊查询 这是今天手头项目中遇到的一个问题,关于mongoose如何实现类似于SQL中 nick LIKE '%keyword%' or email LIKE '%keyword ...

  10. Javascript面向对象编程(一):封装

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...