2014-02-28 3 views
2

Использование Maven 3.1
Затмение HeliosСоздать работоспособную банку с Maven 3.1 с использованием Maven-зависимостей-плагин не создает исполняемую баночку

Аспект:

Попытка создать runable .jar файл с помощью maven- JAR/зависимость-плагинов.

Проблема: После создания файла фляги и зависимостей Есть NoCLassDefFoundErrors, когда я пытаюсь запустить файл банку с командой

java -jar program.jar 

Но класс/файл доступен в папке ./dependency-jars? ?? Я также попытался следующие команды:

java -cp ./dependency-jars -jar program.jar 

Это не работает, тоже.

Вопрос:

Вы знаете, почему JVM не может найти эти классы? Что не так?

pom.xml:

<build> 
    <finalName>program</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <version>2.9</version> 
      <configuration> 
       <downloadSources>true</downloadSources> 
       <downloadJavadocs>true</downloadJavadocs> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>${jdk.version}</source> 
       <target>${jdk.version}</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 

        <manifest> 

         <addClasspath>true</addClasspath> 
         <classpathPrefix>dependency-jars/</classpathPrefix> 
         <mainClass>de.test.MainCLass</mainClass> 
        </manifest> 
       </archive> 
       <outputDirectory>${package-target-folder}</outputDirectory> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-javadoc-plugin</artifactId> 
      <version>2.9.1</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>javadoc</goal> 
        </goals> 
        <phase>package</phase> 
        <id>create-javadoc</id> 
        <configuration> 
         <charset>UTF-8</charset> 
         <outputDirectory>${package-target-folder}/docs</outputDirectory> 
         <reportOutputDirectory>${package-target-folder}/docs</reportOutputDirectory> 

        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.8</version> 
      <executions> 
       <execution> 
        <id>copy-dependencies</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${package-target-folder}/dependency-jars/</outputDirectory> 
        </configuration> 
       </execution> 
       <execution> 


       </execution> 
      </executions> 
     </plugin> 

    </plugins> 
</build> 

[UPDATE]

Созданное MANIFEST.MF выглядит

Manifest-Version: 1.0 
Built-By: ahausden 
Build-Jdk: 1.7.0_25 
Class-Path: dependency-jars/spring-core-4.0.0.RELEASE.jar dependency-j 
ars/commons-logging-1.1.1.jar dependency-jars/spring-jdbc-4.0.0.RELEA 
SE.jar dependency-jars/spring-beans-4.0.0.RELEASE.jar dependency-jars 
/spring-tx-4.0.0.RELEASE.jar dependency-jars/spring-oxm-4.0.0.RELEASE 
.jar dependency-jars/spring-batch-core-2.2.0.RELEASE.jar dependency-j 
ars/xstream-1.3.jar dependency-jars/xpp3_min-1.1.4c.jar dependency-ja 
rs/jettison-1.1.jar dependency-jars/spring-aop-3.2.0.RELEASE.jar depe 
ndency-jars/spring-context-3.2.0.RELEASE.jar dependency-jars/spring-e 
xpression-3.2.0.RELEASE.jar dependency-jars/spring-batch-infrastructu 
re-2.2.0.RELEASE.jar dependency-jars/spring-retry-1.0.2.RELEASE.jar d 
ependency-jars/spring-batch-test-2.2.0.RELEASE.jar dependency-jars/co 
mmons-io-1.4.jar dependency-jars/commons-dbcp-1.2.2.jar dependency-ja 
rs/commons-pool-1.3.jar dependency-jars/commons-collections-3.2.jar d 
ependency-jars/spring-test-4.0.0.RELEASE.jar dependency-jars/javax.in 
ject-1.jar dependency-jars/slf4j-log4j12-1.6.1.jar dependency-jars/sl 
f4j-api-1.6.1.jar dependency-jars/log4j-1.2.16.jar dependency-jars/sp 
ring-orm-4.0.0.RELEASE.jar dependency-jars/aopalliance-1.0.jar depend 
ency-jars/mariadb-java-client-1.1.1.jar dependency-jars/hibernate-cor 
e-4.3.1.Final.jar dependency-jars/jboss-logging-3.1.3.GA.jar dependen 
cy-jars/jboss-logging-annotations-1.2.0.Beta1.jar dependency-jars/jbo 
ss-transaction-api_1.2_spec-1.0.0.Final.jar dependency-jars/dom4j-1.6 
.1.jar dependency-jars/xml-apis-1.0.b2.jar dependency-jars/hibernate- 
commons-annotations-4.0.4.Final.jar dependency-jars/hibernate-jpa-2.1 
-api-1.0.0.Final.jar dependency-jars/javassist-3.18.1-GA.jar dependen 
cy-jars/antlr-2.7.7.jar dependency-jars/jandex-1.1.0.Final.jar depend 
ency-jars/hibernate-annotations-3.5.6-Final.jar dependency-jars/hiber 
nate-commons-annotations-3.2.0.Final.jar dependency-jars/hibernate-jp 
a-2.0-api-1.0.0.Final.jar dependency-jars/javassist-3.12.1.GA.jar dep 
endency-jars/commons-cli-1.3-20140221.042048-103.jar 
Created-By: Apache Maven 3.1.0 
Main-Class: de.test.MainClass 
Archiver-Version: Plexus Archiver 

И последняя "линия" является как разделитель строки , Кажется, файл MANIFEST.MF выглядит немного коррумпированным, не так ли?

+0

удалить .m2 папку в файловой системе, и снова очистить проект и rebuild.it работает для меня –

+0

Dependency Пугин не предназначен для таких целей. – khmarbaise

ответ

0

Хорошо, я решил вторую/обновленную Проблему:

я первым использовать запущенно при затмении с Maven плагина для создания runable файла банки. Это выполняется в описанных проблемах.

В конце концов я попытался использовать maven 3.1 из консольного приложения и, в конце концов, он работает. Кажется, что у плагина eclipse maven есть некоторые проблемы.

0

Вы уверены, что ваша версия java, запущенная в командной строке, равна или больше, чем используется maven при компиляции? попробуйте java -version

+0

Да уже проверено. У меня есть только одна версия java на компьютере, и она точно такая же, как я разработал с помощью –

+0

Итак, что такое класс с NoCLassDefFoundErrors? de.test.MainCLass? – robermann

+0

Исключение в потоке "главный" java.lang.NoClassDefFoundError: орг/апач/Обще/кли/ParseException на java.lang.Class.getDeclaredMethods0 (Native Method) в java.lang.Class.privateGetDeclaredMethods (Unknown Source) –

1

Try, чтобы обеспечить вступление в файл манифеста:

Main-Class: YourClassWithMainMethod 

А также увидеть this post. Поэтому вы можете сделать это вручную и увидеть разницу.

Если dependency-jars директория также попробовать:

java -cp ./dependency-jars/* -jar program.jar 

Я до сих пор не могут оставлять комментарии, пожалуйста, показать, что эти NoCLassDefFoundErrors. И вы пытались сделать тот же файл jar вручную из Eclipse и увидеть разницу?

У вас есть зависимость зависимости-jars/commons-cli-1.3-20140221.042048-103.jar в вашем манифесте, но вы написали, что у вас есть версия SNAPSHOT в каталоге. И есть только commons-cli: commons-cli: 20040117.000000 в центре maven.

@robermann см this post (для работы он должен быть в двойных кавычках, хотя)

+0

Уже сделал. MainClass в MANIFEST.MF верен. Проблема также в том, что я должен создать банку с maven. Нет альтернатив –

+0

java -cp ./dependency-jars/* -jar program.jar не работает –

+0

'-cp ./dependency-jars/*' не может работать, имена jar должны быть раскрыты – robermann

2

Не уверен, что происходит, но это то, что мой ПОМ выглядит для построения работоспособной баночки с помощью тени:

<build> 
     <resources> 
      <resource> 
       <directory>${basedir}/src/main/resources</directory> 
       <filtering>false</filtering> 
       <includes> 
        <include>schema.xsd</include> 
       </includes> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <shadedArtifactAttached>true</shadedArtifactAttached> 
        <shadedClassifierName>stand-alone</shadedClassifierName> 
        <artifactSet> 
         <excludes> 
          <exclude>org.slf4j:slf4j-api:jar:</exclude> 
          <exclude>org.slf4j:slf4j-log4j12:jar:</exclude> 
          <exclude>org.slf4j:jcl-over-slf4j:jar:</exclude> 
          <exclude>commons-logging:commons-logging:jar:</exclude> 
          <exclude>commons-logging:commons-logging-api:jar:</exclude> 
         </excludes> 
        </artifactSet> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
          </excludes> 
         </filter> 
        </filters> 
        <finalName>MyFinalRunnableJarName</finalName> 
        <transformers> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>class.with.main.Method</mainClass> 
         </transformer> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
          <resource>META-INF/spring.handlers</resource> 
         </transformer> 
         <transformer 
          implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
          <resource>META-INF/spring.schemas</resource> 
         </transformer> 
        </transformers> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
+0

Хорошо, я дам ему попробовать ... –

+0

Хорошо. Кажется, что использование тени-плагина решает проблему. Но теперь есть еще одна проблема с инъекцией org.hibernate.SessionFactory. Я постараюсь найти решение. На данный момент проблема источника решена. Благодаря! –

+0

Спасибо за предложение Shade, это сработало для меня в создании исполняемого файла .jar с зависимостями Spring. –

0

с помощью командной строки, перейдите в родительской директории в «зависимостях банки» и запустить: java -jar program.jar

+0

вызов уже java -jar program.jar –

+0

нормально, но в вашем текущем каталоге содержится байт-зависимости dir? – robermann

+1

должен содержать файл ./dependency-jars/commons-cli-1.3-20140221.042048-103.jar ' – robermann

1

Самым простым решением является использование maven-assembly-plugin так:

<project> 
    [...] 
    <build> 
    [...] 
    <plugins> 
     <plugin> 
     <!-- NOTE: We don't need a groupId specification because the group is 
      org.apache.maven.plugins ...which is assumed by default. 
     --> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     [...] 
</project> 
+0

Хорошо, это было хорошим решением. но теперь у меня другая проблема с весной, что контекст не может найти declay из «beans». Но спасибо за первое решение –

0

Используйте эту команду для создания файла jar любого проекта maven.

МВН чистой компиляции установки

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