java - ClassNotFoundException : org. springframework.context.support.ClassPathXmlApplicationContext

标签 java spring maven-2 jar packaging

我正在使用ma​​ven构建独立应用程序,并将依赖项添加到目标jar> 在 lib 文件夹 中使用 ma​​ven-dependency-pluginma​​ven-assemble-plugin 应用程序从 Eclipse 运行良好,没有任何问题,但是当尝试从命令行运行生成的 jar 文件,我收到以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/support/ClassPathXmlApplicationContext
        at com.spring.sample.MainClass.main(MainClass.java:11)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.support.ClassPathXmlApplicationContext
        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)
        ... 1 more

我查看了生成的 jar lib 文件夹,发现 spring-context-support.jar 已经存在,所以我想知道为什么会出现这样的异常。

这是我的ma​​ven 构建配置:

<build>

  <resources>

            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>

  </resources>

      <plugins>


          <plugin> 
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>                       
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.myapp.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>install</id>
                        <phase>install</phase>
                        <goals>
                            <goal>sources</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-resources-plugin</artifactId>
               <version>2.5</version>
               <configuration>
               <encoding>UTF-8</encoding>
               </configuration>
            </plugin>


           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>create-my-bundle</id>
                                <phase>package</phase>
                                    <goals>
                                        <goal>single</goal>
                                    </goals>
                         <configuration>
                           <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                           </descriptorRefs>

                         </configuration>
                        </execution>
                   </executions>

            </plugin> 


      </plugins>
  </build>

最佳答案

你的 POM 有点乱,而且你正在构建两个 jar。

其中一个 jar 的构建方法是首先将依赖项复制到 target/classes/lib 中(一开始这是一种有问题的做法),然后让 jar 插件的默认执行构建其正常的 jar 。这个 jar 像普通 jar 一样包含您的所有代码,但也将所有依赖项 jar 放在 /lib 中。它还具有一个 list ,指定一个 Main-Class 和一个 Class-Path,列出相对路径 lib/...jar< 的所有必需 jar/。听起来这就是你想要运行的。它找不到所需的类的原因是,独立 Java 应用程序的类路径是文件系统上包含类文件的文件夹或 jar 文件的列表。换句话说,它不会在另一个 jar 文件中找到 jar 文件,这就是您所拥有的。为了使其按照您期望的方式工作,您需要在 jar 文件旁边有一个 lib 目录,其中包含所有依赖项。这就是导致您当前问题的原因。

另一个 jar 是由程序集插件构建的。由于您之前对依赖项插件的滑稽 Action ,这个插件也应该在 /lib 中包含所有依赖项 jar,我已经解释过它不会完成任何事情,但由于 jar-with-dependencies 描述符有效,它还会提取所有这些 jar 并将它们的所有类与您自己的类一起放入您的 jar 中。如果你要运行这个 jar,你可能会遇到 ClassNotFoundException,但是像这样的“胖 jar”存在众所周知的问题,这意味着你不应该这样做,除非你有一些真正令人信服的理由。以下问题描述了一个这样的问题:

Maven and Spring = Unable to create application context: Unable to locate Spring NamespaceHandler

关于java - ClassNotFoundException : org. springframework.context.support.ClassPathXmlApplicationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8621608/

相关文章:

java - 线程中的异常 "AWT-EventQueue-0"java.lang.NoSuchMethodError : org. apache.poi.util.POILogger.log(I[Ljava/lang/Object;)V

java - 将 Firebase Auth 从 Android SDK 切换到 Firebase Admin SDK

maven-2 - Maven 2 可以在同一个项目中使用两个不同版本的构建插件吗?

java - 文件大小问题。当 poi 读写时

spring - Spring-JPA EntityManager 如何处理 "broken"连接?

java - 如何在没有 Guava CacheBuilder 的情况下为 Simple @Cacheable 设置 TTL

java - 如何在 Spring MVC 3 中使用 Servlet 3 @WebServlet 和异步?

maven-2 - GWT 2.1 和 Codehaus Maven 插件

maven-2 - 无法编译 Maven GWT 项目

java - 在 Java 中重用 SecretKey