jar运行发生ClassNotFound的完整解决方案

jar运行发生ClassNotFound的完整解决方案原文地址:http://www.java2000.net/viewthread.jsp?tid=6053转载请注明上述链接或者CSDN的链接1今天彻底测试了jar程序TestJar.javapackagenet.java2000.test.jar;importjavax.swing.JOptionPane;importorg.springframework.beans.fa

大家好,又见面了,我是你们的朋友全栈君。

原文地址:http://www.java2000.net/viewthread.jsp?tid=6053
转载请注明上述链接或者CSDN的链接

1 今天彻底测试了jar程序
TestJar.java
package net.java2000.test.jar;

import javax.swing.JOptionPane;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestJar {

  private String message;
  public String getMessage() {

    return message;
  }
  public void setMessage(String message) {

    this.message = message;
  }
  /**
   * @param args
   */
  public static void main(String[] args) {

    BeanFactory beanFactory = new ClassPathXmlApplicationContext(new String[] { “applicationContext.xml” });
    TestJar obj = (TestJar) beanFactory.getBean(“TestJar”);
    System.out.println(obj.getMessage());
    JOptionPane.showMessageDialog(null, “Jar内容”, “Jar标题”, JOptionPane.OK_OPTION);
  }
}

applicationContext.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
  xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
  xmlns:aop=”http://www.springframework.org/schema/aop
  xmlns:tx=”http://www.springframework.org/schema/tx
  xsi:schemaLocation=”http://www.springframework.org/schema/beans <A href=”http://www.springframework.org/schema/beans/spring-beans-2.0.xsd” target=_blank>http://www.springframework.org/schema/beans/spring-beans-2.0.xsd</A>
            <A href=”http://www.springframework.org/schema/aop” target=_blank>http://www.springframework.org/schema/aop</A> <A href=”http://www.springframework.org/schema/aop/spring-aop-2.0.xsd” target=_blank>http://www.springframework.org/schema/aop/spring-aop-2.0.xsd</A>
            <A href=”http://www.springframework.org/schema/tx” target=_blank>http://www.springframework.org/schema/tx</A> <A href=”http://www.springframework.org/schema/tx/spring-tx-2.0.xsd” target=_blank>http://www.springframework.org/schema/tx/spring-tx-2.0.xsd</A>”>
  <bean id=”TestJar” class=”net.java2000.test.jar.TestJar”>
    <property name=”message”>
      <value>Hello World</value>
    </property>
  </bean>
</beans>

2 发现了这个常见的异常
E:/test>java -cp . -jar MyProject.jar
Exception in thread “main” java.lang.NoClassDefFoundError: org/springframework/beans/factory/BeanFactory
Caused by: java.lang.ClassNotFoundException: org.springframework.beans.factory.BeanFactory
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

3 经查找,发现正确的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)如果需要换行,切记在上一行末尾一定要有一个空格,下一行的开头一定要有一个空格
4)最后一行要是一个空行,否则Eclipse打包时有可能把你的Class-Path 给忽略掉

4 运行效果如下:
jar运行发生ClassNotFound的完整解决方案

5 结论
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肯定会搜索这个目录。

<script type=”text/javascript”> </script> <script type=”text/javascript” src=”http://pagead2.googlesyndication.com/pagead/show_ads.js”> </script>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160337.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月16日 上午10:46
下一篇 2022年7月16日 上午10:46


相关推荐

  • xmind 使用教程[通俗易懂]

    1.这是刚刚打开xmind后的界面,在中央有一个中心主题,你可以把它替换成你自己的主题,比如图形推理。2、把光标定位到中心主题上,然后连续按3次Tab键,你会看到上面效果。tab键可以帮助你迅速的建立某个主题的子主题。3、下面你在连续按3次回车键,你就可以看到上面的效果,你可以通过回车键,建立同级主题。4、你自己在试一试,玩一玩者两个键吧!(tab键和enter回车键)5、如何改变主题的分布方式,你还要学习使用“右键”,选择一个主题,然后点击“右键”,你会发现有很多选择。6、选

    2022年4月9日
    365
  • 马化腾低估了 AI?

    马化腾低估了 AI?

    2026年3月14日
    3
  • getmethod方法什么意思_getstring方法

    getmethod方法什么意思_getstring方法getMethod方法要注意的地方:类对象.getMethod(mName,HttpServletRequest.class,HttpServletResponse.class);第一个参数是mName“方法名称”第二个参数是“方法参数的类对象”//这个就是为什么他是.class的原因,为什么参数是类对象?因为这个是Java规定的举个例子  这是一个抽取出的通用的servlet(页面请求经过的第…

    2025年11月24日
    6
  • Pulsar知识整理

    Pulsar知识整理关键特性 Pulsar 的单个实例原生支持多个集群 可跨机房在集群间无缝地完成消息复制 极低的发布延迟和端到端延迟 可无缝扩展到超过一百万个 topic 简单的客户端 API 支持 Java Go Python 和 C 支持多种 topic 订阅模式 独占订阅 共享订阅 故障转移订阅 通过 ApacheBookKe 提供的持久化消息存储机制保证消息传递 基于 PulsarFuncti 的 serverlessco 框架 Pu

    2026年3月18日
    1
  • Python语言程序设计基础(1)—— 程序设计基本方法

    Python语言程序设计基础(1)—— 程序设计基本方法Everybodyinthiscountryshouldlearnhowtoprogramacomputer,becauseitteachesyouhowtothink

    2022年7月5日
    20
  • [转]使用控件的RenderControl()方法导出Excel

    [转]使用控件的RenderControl()方法导出Excel//使用控件的RenderControl()方法生成HTML表格stringstrName=”HuaMingCe”;Response.Clear();Response.Buffer=true;Response.Charset=”utf-8″;Response.AppendH…

    2022年7月20日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号