【问题标题】:Issue while running executable jar : ClassNotFoundException coming运行可执行 jar 时出现问题:ClassNotFoundException 即将到来
【发布时间】:2013-01-30 05:33:39
【问题描述】:

我使用 Maven install 创建了一个 jar,当我使用命令 java -jar MyJar.jar 运行该 jar 时,它给了我异常。下面是堆栈跟踪。

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        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)

我的 pom.xml 中有所有依赖项,并且我成功地将主类作为独立应用程序运行。

然后我提取了 jar 的内容,虽然 Manifest 文件在类路径中包含所有 jar,但我很惊讶地发现其中没有依赖 jar。 下面是生成的 Manifest 文件:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Anand Jain
Build-Jdk: 1.6.0_38
Main-Class: com.hcentive.simulator.cms.beq.response.util.Test
Class-Path: spring-jdbc-3.0.6.RELEASE.jar spring-beans-3.0.6.RELEASE.j
 ar spring-core-3.0.6.RELEASE.jar spring-tx-3.0.6.RELEASE.jar spring-c
 ontext-3.0.6.RELEASE.jar spring-expression-3.0.6.RELEASE.jar spring-a
 sm-3.0.6.RELEASE.jar cglib-nodep-2.2.jar hibernate-jpa-2.0-api-1.0.1.
 Final.jar spring-aop-3.0.6.RELEASE.jar aopalliance-1.0.jar spring-bat
 ch-core-2.1.7.RELEASE.jar xstream-1.3.jar xpp3_min-1.1.4c.jar jettiso
 n-1.1.jar spring-batch-infrastructure-2.1.7.RELEASE.jar commons-beanu
 tils-1.8.3.jar commons-logging-1.1.1.jar hibernate-core-3.5.1-Final.j
 ar antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar xml-ap
 is-1.0.b2.jar jta-1.1.jar slf4j-api-1.5.8.jar commons-dbcp-1.2.2.jar 
 commons-pool-1.3.jar commons-io-1.3.2.jar commons-lang-2.5.jar hsqldb
 -1.8.0.7.jar aspectjrt-1.6.8.jar aspectjweaver-1.6.8.jar log4j-1.2.14
 .jar

有人可以帮忙吗?

【问题讨论】:

  • 是否在 Jar 的清单文件中包含 class-path 元素?
  • 是的,包括我上面提到的这一点
  • “我提取了 jar 的内容,我惊讶地发现其中没有依赖 jar” 不。对于 Java 应用程序部署,我们通常不使用您所指的“jar-in-jar”技术有多种原因。
  • @Andrew - 粘贴清单文件
  • @Anand 确保依赖的 Jar 与可执行 Jar 一起部署。根据清单,它们应该与可执行 Jar 位于相同的上下文中

标签: java spring maven jar packaging


【解决方案1】:

要使用 maven 构建一个包含所有依赖项的 jar,您可以添加...

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.example.MyMain</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

您还应该确保为每个依赖项正确设置范围。

【讨论】:

  • 我应该将它作为 Maven 安装运行吗??
  • 当我作为 Maven 安装运行它时..它生成了两个罐子——一个正常罐子和一个依赖罐子..我只想要一个罐子..
  • @JayTee 我的印象是 Java 无法从另一个 Jar 中加载 Jar 依赖项?最近有没有改变(如果有的话,我会很兴奋)
  • 你只需要标记为'with-dependancies'的那个,它仍然会生成没有依赖关系的普通jar,你也可以忽略它。您应该能够 java -jar foo-with-dependancies.jar 等。
  • @MadProgrammer,我不知道这是否是一个变化,但它现在确实有效。
【解决方案2】:

java -classpath jar1;jar2;jar3;jar4;xml1;xml2;....; jar ExceutableJar.jar

我相信它可能有很多 jar 文件

我建议您将整个命令复制到记事本文件中,并在 Unix 的情况下将其保存为批处理 (.bat) 或 shell 脚本 (.sh)

这样,你可以用一个文件轻松运行jar,而不是重复命令

【讨论】:

  • 不是一个更好的解决方案,因为我需要将此 jar 移交给 QA 团队进行测试..他们不应该为任何外部 jar 所困扰..没有任何方法可以自动执行此操作而无需在命令路径上明确给出它??
  • -cp 在指定 -jar 时被忽略。使用-jar,JVM 依赖于主 jar 中的清单来指定类路径。
  • -jar 被忽略??呸呸呸呸??请解释
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2013-04-26
  • 2013-11-18
  • 1970-01-01
  • 2010-09-23
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多