2012-03-28 2 views
4

Эй, поэтому я работал над проектом, который я хочу запустить в качестве исполняемого банку из командной строки. Я смог создать банку с зависимостями, используя Mavens assembly: single command. Мой pom выглядит так.Проблемы с исполняемым банком с зависимостями

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>org.openmetadata.main.OmadUpdate</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Сборки успешно и создает банку ОМАД-обновление-0.0.1-SNAPSHOT-банку-с-dependencies.jar. Я иду в проектах целевой папку в командной строке и введите

java -jar omad-update-0.0.1-SNAPSHOT-jar-with-dependencies.jar 

Я также попытался

java -cp omad-update-0.0.1-SNAPSHOT-jar-with-dependencies.jar org.openmetadata.main.OmadUpdate 

К сожалению, в каждом конкретном случае мне дает java.lang.NoClassDefFoundError: орг/openmetadata/основным/OmadUpdate. Я смущен, потому что знаю, что мой основной класс находится в пакете org.openmetadata.main, и все же он не найден. Я считаю это особенно запутанным, потому что в моем pom я указываю этот класс как мой основной класс. Я попытался изменить имя основного класса на src.main.java.org.openmetadata.main.OmadUpdate и просто OmadUpdate, но ни один из них не имеет эффекта. Спасибо за любую помощь заранее.

ответ

2

Я не вижу запись в манифесте выше, но ваше очень длинное имя файла упоминает зависимости. Если в этом файле jar есть баны, зависящие от вашей программы, вы должны перечислить их в разделе Class-Path. См. Adding Classes to the JAR File's Classpath для более подробной информации.

+0

но в соответствии с этой страницей [link] (http://maven.apache.org/plugins/maven-assembly-plugin/usage.html#aResources), похоже, что я должен указать путь к классам, похоже он будет просто упаковывать зависимости maven по мере необходимости. Я предполагаю, что могу ошибаться, полагая, что все-таки. – decal

+0

Откройте файл jar и найдите файл MANIFEST.MF в каталоге META-INF. Указывается ли путь к классам? – Mike

+1

Хорошо, поэтому я нашел на Mavens [сайт] (http://maven.apache.org/shared/maven-archiver/examples/classpath.html#aMake), добавляющий true в мой pom.xml должен позаботиться о пути classpath. Однако у меня все еще возникает проблема, связанная с тем, что мой основной класс не может быть найден, когда я пытаюсь запустить исполняемый банку. – decal

0

Другим вариантом может быть использование onejar-maven-plugin. К сожалению, страница usage немного скудна, но плагин делает то, что должно быть настроено правильно.

0

Я, наконец, смог заставить это работать, добавив следующий код моему пом.

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>org.openmetadata.omadupdate.OmadUpdate</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> 
    </plugins> 
</build> 

Без тега казни в ПОМ вместе со своими детьми только зависимости Maven будут добавлены в банку и классы от самого проекта не будет добавлен.

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