2013-11-29 5 views
1

Я пытаюсь создать единый Runnable jar, содержащий мои классы и зависимости, и после того, как мне удалось создать файл, я застрял. Когда я исполняю свою баночку:Maven build manifest не содержит classpath.

java -jar Amp60-distribution.jar 

Я получаю следующее сообщение об ошибке:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2521) 
    at java.lang.Class.getMethod0(Class.java:2764) 
    at java.lang.Class.getMethod(Class.java:1653) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 

Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
... 6 more 

Я проверил мой MANIFEST.MF и не содержит:

классам
Manifest-Version: 1.0 
Built-By: jtormin 
Build-Jdk: 1.7.0_45 
Created-By: Apache Maven 3.0.4 
Main-Class: gui/MainFrame 
Archiver-Version: Plexus Archiver 

Мой POM .xml:

<build> 
     <sourceDirectory>src</sourceDirectory> 
     <resources> 
      <resource> 
       <directory>resources</directory> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <archive> 
         <addMavenDescriptor>false</addMavenDescriptor> 
         <compress>true</compress> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <mainClass>gui/MainFrame</mainClass> 
          <classpathLayoutType>custom</classpathLayoutType> 
          <customClasspathLayout> 
           $${artifact.groupId}.$${artifact.artifactId}.$${artifact.extension} 
          </customClasspathLayout> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <finalName>Amp60</finalName> 
        <outputDirectory>target</outputDirectory> 
        <descriptor>assembly/assembly.xml</descriptor> 
        <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>gui/MainFrame</mainClass> 
        </manifest> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>net.sf.opencsv</groupId> 
      <artifactId>opencsv</artifactId> 
      <version>2.3</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.17</version> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-math3</artifactId> 
      <version>3.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.jfree</groupId> 
      <artifactId>jfreechart</artifactId> 
      <version>1.0.15</version> 
     </dependency> 
     <dependency> 
      <groupId>jakarta-regexp</groupId> 
      <artifactId>jakarta-regexp</artifactId> 
      <version>1.4</version> 
     </dependency> 
    </dependencies> 
    <organization> 
     <name>ISP</name> 
    </organization> 
</project> 

Th e assembly.xml:

<assembly 
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.4"> 
    <id>distribution</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
     <fileSet> 
      <directory>target/classes/</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>**</include> 
      </includes> 
     </fileSet> 
     <fileSet> 
      <directory>resources</directory> 
      <outputDirectory>resources</outputDirectory> 
      <includes> 
       <include>**</include> 
      </includes> 
     </fileSet> 
    </fileSets> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory>/</outputDirectory> 
      <useProjectArtifact>false</useProjectArtifact> 
      <useTransitiveDependencies>true</useTransitiveDependencies> 
     </dependencySet> 
    </dependencySets> 
</assembly> 
+0

ли принятый ответ по адресу: // StackOverflow .com/questions/1510071/maven-how-can-i-add-a-any-classpath-entry-to-a-jar help? – DaveH

+0

Спасибо, но это не сработало. Я новичок в Maven, но я думаю, что обе ситуации немного разные. В этом случае Maven не генерирует Classpath. Несмотря на это, я попробовал решение, и eclipse сообщило о следующей проблеме: 'Невозможно найти сеттер, сумматор или поле в org.apache.maven.archiver.ManifestConfiguration для 'manifestEntries'' – jrtormin

ответ

0

Я думаю, что есть пара более элегантных и простых способов достижения вашей цели - построить JAR со всеми зависимостями. По крайней мере, дополнительный файл с именем assembly.xml меня смущает. Попробуйте удалить assembly.xml и maven-jar-plugin и использовать это:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
    <archive> 
     <manifest> 
     <mainClass>gui.MainFrame</mainClass> 
     </manifest> 
    </archive> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    </configuration> 
    <executions> 
    <execution> 
     <id>make-assembly</id> <!-- this is used for inheritance merges --> 
     <phase>package</phase> <!-- bind to the packaging phase --> 
     <goals> 
     <goal>single</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Но на самом деле, мне не нравится, потому что maven-assembly-plugin извлекает файлы из всех баночек и пакетов всех файлов в один баночку. Таким образом, возможны проблемы с коллизиями - например, log4j.xml может быть представлен дважды из 2 зависимых JAR-пакетов, которые были распакованы. Поэтому я предлагаю использовать one-jar-plugin с dependency-plugin (удалить maven-jar-plugin и maven-assembly-plugin с assembly.xml):

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.5.1</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 

         <outputDirectory>${project.build.directory}/lib/</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.dstovall</groupId> 
      <artifactId>onejar-maven-plugin</artifactId> 
      <version>1.4.4</version> 
      <executions> 
       <execution> 
        <configuration> 
         <mainClass>gui.MainFrame</mainClass> 
         <attachToBuild>true</attachToBuild> 
        </configuration> 
        <goals> 
         <goal>one-jar</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Кроме того, необходимо явно указать хранилище для one-jar-plugin:

<pluginRepositories> 
    <pluginRepository> 
     <id>onejar-maven-plugin.googlecode.com</id> 
     <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+0

Благодарим вас, WelcomeTo. Я использовал второе решение (onejar), и оно сработало. Единственная проблема заключается в том, что он не может загрузить ресурс и запустил исключение: 'Исключение в потоке«главный»java.lang.reflect.InvocationTargetException Вызванный: java.lang.NullPointerException \t в gui.MainFrame.main (MainFrame.java:145) ' Это исключение было вызвано следующим кодом строки: ' InputStream logFileConfiguration = ClassLoader.getSystemResourceAsStream ("Conf/log4j.properties"); ' каталог конф и файл log4j в банке , но я до сих пор не понял, почему он не смог их найти. – jrtormin

+0

@ user1637370 Попробуйте заменить код следующим: 'Thread.currentThread(). GetContextClassLoader(). GetResourceAsStream (" log4j.xml ")' или если он не работает, попробуйте следующее: 'SomeYourClass.class.getClassLoader() .getResourceAsStream ("log4j.xml") ' – WelcomeTo

+0

Это не сработало, но я нашел решение: ' InputStream logFileConfiguration = MainFrame.class.getResourceAsStream ("/ conf/log4j.свойства ");' – jrtormin

Смежные вопросы