2013-03-01 4 views
13

У меня есть мультимодульный проект maven, и один из модулей предназначен для распространения.Есть ли хороший способ использовать maven для запуска исполняемого банку?

Project \ 
| moduleA \ 
| moduleB \ 
| ... 
| dist-module \ 

В дистрибутиве имеется исполняемый фляга, которую я хотел бы легко выполнить. Однако, чтобы выполнить его, я должен ввести что-то вроде:

java -jar dist-module/target/dist-module-1.0-SNAPSHOT-full-dist/myJar.jar 

Было бы весьма желательно, просто наберите:

mvn exec:java \ OR 
mvn exec:exec 

К сожалению, я не могу найти способ, чтобы получить Java цель выполните .jar. Цель exec на самом деле это сделает, но есть улов: в банке есть встроенный сервер причалов, и из-за того, как работает exec (не использует тот же JVM как maven), сервер не завершается, если я не убью процесс вручную, что тоже надоедает.

Любые рекомендации о том, как это сделать, используя maven?

Edit:
Для пояснения, эта команда в первую очередь будет использоваться для простого ручного дыма тестирования; чтобы прочитать выход журнала и обеспечить правильную работу программы в своей среде распространения. Таким образом, вероятно, это должен быть блокирующий вызов ctrl-c, завершающий как сервер, так и maven.

Встроенный сервер специализирован для запуска нескольких конкретных приложений и не перезагружает их автоматически. Таким образом, нет большой необходимости поддерживать работу сервера независимо от maven в течение длительных периодов времени.

+0

Какова задача причала? – Nachtgold

+0

Можете ли вы прикрепить pom с проблемным exec: определение цели java? –

+0

Нет никакого хорошего способа, потому что maven - это инструмент для сборки и развертывания. Если ваша банка является частью процесса сборки, напишите для нее плагин maven. Если вы просто хотите использовать maven для запуска своего приложения, возможно, лучше подумать о чем-то другом. – kan

ответ

25

МВН Exec: Java запускает приложение непосредственно с выхода компилятора ниже цели/- не нужно бежать из кувшина:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>java</goal> 
       </goals> 
       <configuration> 
        <mainClass>uk.co.pookey.hibernate.App</mainClass> 
        <systemProperties> 
         <systemProperty> 
          <key>derby.stream.error.file</key> 
          <value>${basedir}/target/derby.log</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin>    

Если вы хотите запустить банку с МВНАМИ Exec: EXEC:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <id>default-cli</id> 
       <goals> 
        <goal>exec</goal> 
       </goals> 
       <configuration> 
        <executable>java</executable> 
        <!-- optional --> 
        <workingDirectory>/tmp</workingDirectory> 
        <arguments> 
         <argument>-jar</argument> 
         <argument>${basedir}/target/hibernate-derby-memory-${project.version}.jar</argument> 
        </arguments> 
       </configuration>       
      </execution> 
     </executions> 
    </plugin>   

Если у вас есть проблемы с молами завершающими, я рекомендую запускать тест интеграции (или просто не выйти причал основного потока, не выключая причал первого, или просто использовать остановку Jetty в порт)! В фоновом режиме можно запустить JVM и позволить maven снова остановить его после тестирования. Для этого есть три этапа: предварительная интеграция-тест, интеграция-тест или пост-интеграция-тест. Вы можете узнать больше об этом на http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing. При использовании молы Maven плагина, то pom.xml конфигурация может понравиться:

<plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <!-- test start/stop: --> 
     <executions>     
      <execution> 
       <id>start-jetty</id> 
       <phase>pre-integration-test</phase> 
       <goals> 
        <goal>deploy-war</goal> 
       </goals> 
       <configuration> 
        <daemon>true</daemon> 
        <systemProperties> 
         <systemProperty> 
          <name>some.prop</name> 
          <value>false</value> 
         </systemProperty> 
        </systemProperties> 
       </configuration> 
      </execution> 
      <execution> 
       <id>stop-jetty</id> 
       <phase>post-integration-test</phase> 
       <goals> 
        <goal>stop</goal> 
       </goals> 
      </execution> 
     </executions>  
    </plugin> 

Вместо связывание молов Maven плагин для этих фаз, можно связать Maven antrun плагин для выполнения произвольных команд.

+0

Мне нужно запустить банку, потому что он содержит логику, которая идентифицирует свой путь и указывает другие ресурсы в том же каталоге. Следовательно, это фактически проект распределения, который должен выполнить код. Однако использование maven для тестирования интеграции - интересная возможность, которую стоит изучить, поэтому +1 для этого, по крайней мере. – Shaun

+0

Похоже, вы заново изобретаете колесо. Если вам нужно надлежащее распространение, подумайте об использовании военных файлов и, возможно, обертки tanukisoft, чтобы запустить их в процессе производства, - если вы не хотите использовать целые серверы приложений, такие как tomcat и jetty, для вас достаточно. Обертка tanukisoft запускает сервер приложений причала и запускает ваши веб-приложения из распакованного архива. Если вам нужен пример, посмотрите исходный код Archiva. Если вам нужна помощь, я сделал это раньше ... И при использовании военных файлов вы могли бы использовать приведенный мною пример пристройки. – user1050755

+0

Если у вас есть урезанная версия вашего проекта сервера, я могу попробовать. Не должно быть слишком сложно. Но мне никогда не удавалось программировать веб-приложения для причалов :-) – user1050755

3

Я хотел бы использовать Maven муравей или gmaven (используйте заводной муравей строитель), если вы хотите выполнить набить

После ваших правок это звучит, как вы используете что-то вроде DropWizard. Возможно, вам захочется посмотреть, как они находятся solving that problem.

Редактировать на основе комментариев:

Спринг загрузки Maven будет создавать исполняемые войны, а также выполнять их, и вам не нужно Spring бутсу, ни весной. Более подробно в моем ответе здесь: Can spring-boot-maven-plugin be used for non spring project?

+0

В то время как я чувствую, что ответ пользователя1050755 более непосредственно обращается к вопросу, вы получили мою благодарность за то, что привлекли внимание DropWizard. Это не совсем удовлетворяет потребности моего проекта, но это достаточно похоже на интересное тематическое исследование. – Shaun

+0

Обе ссылки в этом ответе мертвы на момент написания этой статьи. – Stephan

+0

@Stephan На самом деле лучшим вариантом, который я сейчас рекомендую, является плагин Spring Boot maven, который, кстати, не нуждается в Spring Boot или даже Spring. См. Мой ответ здесь: https://stackoverflow.com/questions/42696495/can-spring-boot-maven-plugin-be-used-for-non-spring-project/43017960#43017960 –

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