ClassNotFoundException:org.springframework.context.support.ClassPathXmlApplicationContext

时间:2011-12-23 23:40:20

标签: java spring maven-2 jar packaging

我正在使用 maven 进行独立应用程序构建,并将依赖项添加到目标jar lib文件夹中使用 maven-dependency-plugin maven-assembly-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 已经存在,所以我想知道为什么我会遇到这样的异常。

这是我的 maven构建配置

<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>

2 个答案:

答案 0 :(得分:2)

你那里有一堆乱七八糟的POM,你正在建造两个罐子。

其中一个jar是通过首先将依赖项复制到target/classes/lib - 一个可疑的实践开始 - 并让jar插件的默认执行构建其普通jar来构建的。这个jar包含了所有代码,就像普通的jar一样,但在/lib内包含了所有的依赖jar。它还有一个清单,用于指定Main-ClassClass-Path列出相对路径lib/...jar所需的所有广告。听起来这是你想要跑的那个。它无法找到所需类的原因是独立Java应用程序的类路径是文件系统上包含类文件的文件夹或jar文件的列表。换句话说,不会在另一个jar文件中找到jar文件,这就是你所拥有的。为了实现您的预​​期,您需要在jar文件旁边有一个lib目录,该目录中包含所有依赖项。这就是造成你现在问题的原因。

另一个jar由程序集插件构建。由于你之前使用依赖插件的滑稽动作,这个也应该在/lib中包含所有依赖关系jar,我已经解释过它不会完成任何事情,但是因为jar-with-dependencies描述符工作,它也将提取所有这些jar并将所有类与您自己的类一起放入jar中。如果你要运行这个jar,你可能会超越ClassNotFoundException,但是像这样的“胖罐子”存在众所周知的问题,这意味着你不应该这样做,除非你有一些非常有说服力的理由。以下问题描述了一个这样的问题:

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

答案 1 :(得分:0)

该类位于spring-context.jar中。在pom.xml中添加该依赖项。

相关问题