ClassNotFoundException: org.springframework.context.support.ClassPathXmlApplicationContext - PullRequest
1 голос
/ 24 декабря 2011

Я работаю над автономным приложением build с 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 ]

2 голосов
/ 24 декабря 2011

У вас там какой-то беспорядок POM, и вы строите две банки.

Один из jar-файлов создается путем первого копирования ваших зависимостей в target/classes/lib - сомнительная практика для начала - и позволяющий выполнению плагина jar по умолчанию создать свой обычный jar-файл. Этот jar содержит весь ваш код, как обычный jar, но также содержит все ваши jar зависимостей внутри /lib. Он также имеет манифест, который задает Main-Class и Class-Path, перечисляя все необходимые банки в относительном пути lib/...jar. Похоже, это тот, кого вы пытаетесь запустить. Причина, по которой он не может найти нужные ему классы, заключается в том, что путь к классу для автономного приложения Java представляет собой список папок или файлов JAR в файловой системе, которые содержат файлы классов. Другими словами, он не найдет файлы JAR внутри другого файла JAR, что и есть у вас. Чтобы это работало так, как вы ожидаете, вам понадобится каталог lib рядом с вашим JAR-файлом, в котором есть все зависимости. Это то, что вызывает вашу настоящую проблему.

Другой jar создан плагином сборки. Из-за ваших более ранних выходок с плагином зависимостей, этот должен также содержать все jar зависимостей в /lib, что, как я уже объяснил, ничего не даст, но из-за того, как работает дескриптор jar-with-dependencies, он также извлечет все эти банки и поместит все их классы в вашу банку вместе с вашими собственными классами. Если бы вы запустили этот jar-файл, вы, вероятно, миновали бы исключение ClassNotFoundException, но есть такие хорошо известные проблемы с «толстыми банками», как это, которые означают, что вы не должны этого делать, если у вас нет действительно веских причин для этого. Одна такая проблема описана в следующем вопросе:

Maven и Spring = Невозможно создать контекст приложения: невозможно найти Spring NamespaceHandler

0 голосов
/ 24 декабря 2011

Класс находится в spring-context.jar.Добавьте эту зависимость в pom.xml.

...