【问题标题】:executing jar file: Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext执行jar文件:引起:java.lang.ClassNotFoundException:org.springframework.context.ApplicationContext
【发布时间】:2013-07-18 14:03:43
【问题描述】:

我创建了一个 Maven 项目。输入后: mvn clean package 一切正常,我在目标中看到了我的 jar 文件。但是,如果我单击该文件,则会收到以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/c
ontext/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.Applica
tionContext
        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)
Could not find the main class: comt.test.Test. Program will exit

我可以在Eclipse下运行项目,运行正常,但是jar文件不行。

这是Manifest的内容:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Build-Jdk: 1.6.0_23
Main-Class: com.stlpo.App
Class-Path: commons-httpclient-3.1.jar commons-codec-1.2.jar h2-1.2.138.jar 
commons-lang-2.5.jar spring-core-3.0.3.RELEASE.jar spring-asm-3.0.3.RELEASE.jar co
 mmons-logging-1.1.1.jar spring-context-3.0.3.RELEASE.jar spring-beans
 -3.0.3.RELEASE.jar spring-expression-3.0.3.RELEASE.jar spring-orm-3.0
 .3.RELEASE.jar spring-tx-3.0.3.RELEASE.jar spring-aop-3.0.3.RELEASE.j
 ar aopalliance-1.0.jar spring-jdbc-3.0.3.RELEASE.jar spring-test-3.0.
 3.RELEASE.jar cglib-nodep-2.2.jar logback-core-0.9.24.jar logback-cla
 ssic-0.9.24.jar slf4j-api-1.6.0.jar hibernate-annotations-3.5.4-Final
 .jar hibernate-core-3.5.4-Final.jar antlr-2.7.6.jar commons-collectio
 ns-3.1.jar jta-1.1.jar hibernate-commons-annotations-3.2.0.Final.jar 
 hibernate-jpa-2.0-api-1.0.0.Final.jar hibernate-entitymanager-3.5.4-F
 inal.jar cglib-2.2.jar asm-3.1.jar javassist-3.9.0.GA.jar opencsv-2.1
 .jar jfreechart-1.0.13.jar jcommon-1.0.16.jar commons-beanutils-1.8.3
 .jar beansbinding-1.2.1.jar poi-3.6.jar log4j-1.2.13.jar
  poi-ooxml-3.6.jar poi-ooxml-schemas-3.6.jar xmlbeans-2.3.0.jar stax-
 api-1.0.1.jar geronimo-stax-api_1.0_spec-1.0.jar dom4j-1.6.1.jar xml-
 apis-1.0.b2.jar commons-dbcp-1.4.jar commons-pool-1.5.4.jar TableLayo
 ut-20050920.jar

提前感谢您的帮助。

【问题讨论】:

  • 如果您打算单独运行 jar 文件,则需要粘贴 META-INF/MANIFEST.MF 的内容。看看这个link

标签: java maven jar package


【解决方案1】:

当您构建 JAR 时,它只包含您的类。它不包含您的项目所依赖的所有其他库。 (这样做是可能的,但它并不常见,而且大多数情况下是不可取的。)要在依赖于 Spring 的 JAR 中运行一个类,你必须确保 Spring 在类路径中,或者通过将类路径传递给 java 可执行文件(doesn'如果使用 -jar 参数或在 JAR 的清单文件中放置 "Class-Path" attribute,则无法正常工作。当然,不仅仅是春天。您必须为项目所依赖的每个 jar 包含一个类路径条目。

【讨论】:

  • 嗨@Ryan。在我的清单中,我已经有了春天的依赖。我需要额外写smthg吗?
  • 除非我弄错了,否则 JAR 的 Class-Path 是相对于当前工作目录解析的路径列表。这意味着当您运行 JAR 时,所有列出的 jar 都必须位于 CWD 所在的任何位置。
【解决方案2】:

查看另一篇帖子regarding the same problem 您需要为依赖项(在您的情况下为 spring)创建一个 classPath(eclipse 会自动为您创建,这就是为什么您可以毫无问题地从 eclipse 中破坏项目)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>fully.qualified.MainClass</mainClass> 
                <addClasspath>true</addClasspath>
                <!-- use class path prefix if your dependencies are out side the jar)
                <classpathPrefix>lib/</classpathPrefix> -->          
            </manifest>

            <manifestEntries>
                <Class-Path>conf/</Class-Path>
            </manifestEntries>
        </archive>

    </configuration>
</plugin>

【讨论】:

  • 感谢提示@AdiMor 我会尝试你的答案并发布结果
  • 我试过了,但还是不行,因为不是很重要,所以我停止了进一步搜索..thx 寻求帮助
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2015-07-25
  • 2017-12-21
  • 2012-02-18
相关资源
最近更新 更多