【问题标题】:SPRING java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext春天 java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
【发布时间】:2020-08-22 12:11:50
【问题描述】:

似乎人们也有类似的问题,但在 IDE 上。 我没有使用 IDE。

我使用 Maven 依赖项安装了 Spring,正如您将在我的 build.xml 文件中看到的那样。

我收到以下堆栈跟踪,显示 org.springframework.context 未找到:

运行解耦:

[java] java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
 [java]     at java.lang.Class.getDeclaredMethods0(Native Method)
[java]     at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
 [java]     at java.lang.Class.getMethod0(Class.java:2685)
 [java]     at java.lang.Class.getMethod(Class.java:1620)
 [java]     at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:488)
 [java]     at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
 [java] Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
 [java]     at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
 [java]     at java.security.AccessController.doPrivileged(Native Method)
 [java]     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
 [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
 [java]     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
 [java]     ... 6 more
 [java] Exception in thread "main"
 [java] Java Result: 1

构建成功 总时间:4秒

这是我的客户端(java 文件:DecoupledDataReaderClient.java):

package com.example.decouple.client;

import java.io.*;
import java.util.*;
import com.example.filereader.IReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DecoupledDataReaderClient {
  private IReader reader = null;
  private ApplicationContext ctx = null;
  public DecoupledDataReaderClient() {
    ctx = new ClassPathXmlApplicationContext("beans.xml");
  }
  private String fetchData() {
    reader = (IReader) ctx.getBean("reader");
    return reader.read();
  }
  public static void main(String[] args) {
    DecoupledDataReaderClient client = new DecoupledDataReaderClient();
    System.out.println("Example 1.3: Got data: " + client.fetchData());
  }
}

这是我的 build.xml 文件,其中包含 spring 依赖项和类路径以及使用 MAVEN 的 xmlns *编辑:添加了 RUN-DECOUPLE 的类路径*

<project name="data-reader" default="compile" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
    <property name="src" location="."/>
    <property name="obj" location="../classes"/>
    <property name="jarfile" location="../data-reader.
        jar"/>

    <target name="init">
        <mkdir dir="dist" />
        <artifact:dependencies pathId="dependency.classpath">
            <dependency groupId="org.springframework"
                        artifactId="spring-context"
                        version="3.2.4.RELEASE" />
        </artifact:dependencies>
    </target>

    <target name="compile" depends="init">
        <mkdir dir="${obj}"/>
        <depend srcdir="${src}" destdir="${obj}" />
        <javac includeantruntime="false" 
               srcdir="${src}" 
               destdir="${obj}">
            <classpath refid="dependency.classpath" />
        </javac>
    </target>

    <target name="jar" depends="compile">
        <jar basedir="${obj}" destfile="${jarfile}">
            <include name="*.class"/>
        </jar>
    </target>

    <target name="run" depends="compile">
        <java classpath="${obj}" classname="VanillaDataReaderClient"/>
    </target>

    <target name="decouple-jar" depends="compile">
        <jar destfile="dist/decouple.jar" basedir="${obj}">
            <manifest>
                <attribute name="Main-Class" value="com.example.decouple.client.DecoupledDataReaderClient"/>
            </manifest>
        </jar>  
    </target>

    <target name="run-decouple" depends="decouple-jar">
    <java fork="true" jar="dist/decouple.jar" >
        <classpath>
            <path refid="dependency.classpath" />
        </classpath>
    </java>
</target>


</project>

最后,这是我的 beans.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" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="reader" class="com.example.filereader.VanillaFileReader">
        <constructor-arg value="src/hello.txt" />
    </bean>
</beans>

如果有人可以帮助我解释为什么即使 spring 依赖项在我的 build.xml 中(根据 build.xml 的输出成功下载)并且在类路径中也找不到该类,我会非常欣赏它。

提前致谢。

【问题讨论】:

  • 你试过maven clean install吗?还是使用 maven,您只想下载 .jar 文件?
  • 问题出在您的 pom.xml 中,它缺少依赖项。你需要分享它。
  • @porfiriopartida 我没有。正如我所提到的,我使用“xmlns:artifact="antlib:org.apache.maven.artifact.ant" 行来允许我的文件使用 Maven 的依赖项。然后我使用它的依赖项尝试下载应该已经安装的 Spring它,但是我在调​​用 Spring 类时遇到了我提到的错误
  • @Lokesh - 我在哪里可以找到 pom.xml 文件,共享它是什么意思?
  • @porfiriopartida 我想我现在明白你的意思了.. 是否将依赖项添加到我的 build.xml 只下载了 Spring 的 jar 文件,但没有安装它们?

标签: java spring maven dependencies noclassdeffounderror


【解决方案1】:

artifact:dependencies 将 Spring 依赖项的类路径存储在路径 dependency.classpath 中,您在编译时使用它:

<javac ...
    ...
    <classpath refid="dependency.classpath" />

但是,当您运行时,您只会在类路径中包含已编译的源代码:

<target name="run" depends="compile">
    <java classpath="${obj}" classname="VanillaDataReaderClient"/>
</target>

这意味着不包括 Spring 类。

也尝试包含dependency.classpath

<target name="run" depends="compile">
    <java classname="VanillaDataReaderClient">
        <classpath>
            <pathelement location="${obj}"/>
            <path refid="dependency.classpath"/>
        </classpath>
    </java>
</target>

编辑: 您的 run-decouple 目标正在使用 jar: "When using the jar attribute, all classpath settings are ignored"。切换到指定主类和类路径,这样你就可以包含依赖项了:

<target name="run-decouple" depends="decouple-jar">
    <java fork="true" classname="com.example.decouple.client.DecoupledDataReaderClient">
        <classpath>
            <pathelement location="dist/decouple.jar" />
            <path refid="dependency.classpath" />
        </classpath>
    </java>
</target>

【讨论】:

  • 我实际上是在尝试运行“run-decouple”目标。标题为“运行”的目标工作得很好。除此之外,我已经尝试将 refid 包含在“run-decouple”目标中,但也失败了。
  • 如果run-decouple依赖于Spring,请尝试在那里进行相同的更改,并显示任务配置和错误。
  • 抱歉回复晚了。我已经编辑了 build.xml 以显示 run-decouple 中的类路径差异。但是错误仍然完全相同。
  • 你正在使用jar;来自the documentation“使用 jar 属性时,所有类路径设置都将被忽略”。定义&lt;pathelement location="dist/decouple.jar"/&gt;dependency.classpath的类路径,并指定classname
  • 我会使用&lt;pathelement path="dependency.classpath"/&gt; 还是保留refid??
猜你喜欢
  • 2013-04-06
  • 2017-02-19
  • 1970-01-01
  • 2014-04-15
  • 2021-05-28
  • 1970-01-01
  • 2015-10-14
  • 2015-02-04
  • 2015-04-22
相关资源
最近更新 更多