Как я могу упаковать и запустить приложение командной строки с зависимостями, используя maven?

Я совершенно новый и для java, и для maven, так что это, вероятно, очень просто.

Если я следую инструкциям maven2 hello world здесь:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

все работает нормально. Если я затем изменяю pom.xml, чтобы вносить зависимость из удаленного репозитория, файлы для этой зависимости сохраняются в ~/.m2/repository/new-dependency/.

Использование синтаксиса в инструкциях hello world для запуска приложения требует, чтобы я добавлял абсолютный путь к зависимости к моему пути к классам (либо путем установки переменной среды, либо с помощью переключателя командной строки):

java -cp target/my-app-1.0-SNAPSHOT.jar:/.../.m2/.../new-dependency.jar com.mycompany.app.App

Это, очевидно, будет быстро громоздким:)

Я подозреваю, что это не обычный способ запуска java-программы, и мне просто нужно больше узнать о файлах .jar, но пока я это делаю, я был бы признателен за любые советы о том, как это сделать должным образом.

Я не использую IDE, кстати. vim из командной строки.

Спасибо!

Майк.

Ответ 1

Вы можете сделать исполняемый файл jar, добавив атрибут Main-Class в его файл манифеста. В Maven это делается с помощью плагина архивирования. Чтобы добавить атрибут Main-Class, добавьте его в свой pom.xml:

 <build>
   <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>        
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>com.mycompany.app.App</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
 </build>

Теперь вы можете запустить свою банку с помощью команды: java -jar myjar.jar или двойным щелчком по ней (недоступно на всех платформах).

Ответ 2

Вы можете использовать maven для его запуска, я считаю, что он устанавливает для вас путь к классам.

mvn compile

скомпилирует его то вы запустите:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App"  

который выполнит его.

Вы можете увидеть http://www.vineetmanohar.com/2009/11/3-ways-to-run-java-main-from-maven/ для получения дополнительной информации о способах запуска (включая передачу аргументов командной строки тому, что вы хотите запустить )

Ответ 3

Если вы хотите, чтобы это было просто для вас и других, вы можете создать банку со всеми зависимостями в ней, используя плагин maven-assembly-plugin. Пример здесь: http://maven.apache.org/plugins/maven-assembly-plugin/usage.html, раздел Выполнение: построение сборки

Ответ 4

Вы можете использовать maven-shade-plugin, который создаст исполняемую uber-войну со всеми зависимостями.

ИЛИ

Используйте appassembler-plugin, который создает script, который импортирует все зависимости и позволяет выполнять основной класс из командной строки.