2016-07-26 2 views
2

У меня есть проект Maven, который мне нужно как-то скомпилировать, чтобы я мог передать скомпилированный файл на другую машину, а затем выполнить там (с потенциально разными Java-версия). я смотрел на эту SO questionКак скомпилировать проект Java на основе Maven для запуска из командной строки

и был в состоянии выполнить:

mvn clean install 
mvn dependency:copy-dependencies 

Но когда я попробовал:

cd target/ 
java -cp myApp-0.0.1.jar:dependency myApp 

Я получил

Error: Could not find or load main class myApp 

Мой pom.xml не есть mvn-assembly-plugin или maven-jar-plugin (и я успешно получаю .jar в target/after mvn clean install).

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

ответ

3

Существует плагин Maven build, который свяжет все ваши зависимости в JAR. Вы можете выполнить его просто с

java -jar mybundled.jar 

не заботясь о зависимости пути к курсу.

И вот идет плагин Maven. Замените MainClass на вашу точку входа.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4.1</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs>  
     <archive> 
     <manifest> 
      <mainClass>com.yourdomain.Main</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
</plugin> 

Как он связан с package lifecycle, вы найдете в комплекте JAR в целевом каталоге после выполнения ...

mvn package 

Что касается вашего беспокойства, что ваш код не будет работать на другой машина, Java не зависит от платформы и обычно вы можете положиться на это. Тем не менее, мне приходят три вещи, которые могут усложнить жизнь:

  1. Ваш код зависит от системного кодирования. Maven должен дать вам предупреждение в журнале, советуя вам указать его явно.
  2. Вы взаимодействуете со средой выполнения, например, с выполнением системных команд. ps не будет работать на окнах и dir /s, вероятно, не на * nix.
  3. Версия вашей среды Java отличается. Конечно, код JavaFX не будет работать с Java 1.5. Если вы используете новейшие функции, убедитесь, что у ваших клиентов уже есть соответствующая версия или, по крайней мере, они могут получить ее откуда-то. Вы могли бы хотеть смотреть на source и target опции компиляции, тоже: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-example
+1

Хорошо, все это работало, но так как я использую некоторые конфигурационные файлы, расположенные в 'SRC/главная/config', мне нужно запустите банку из верхней папки способом 'java -jar target/mybundled.jar'. Я посмотрю, как это происходит с переносом на другую машину (я беспокоюсь, что у меня есть другая Java, а затем .jar может работать некорректно. Можно ли вообще запустить ее на такой другой машине?) а затем ответит на него как можно скорее. – alisa

+0

Рад, что я мог бы помочь. Я добавил комментарий к своему сообщению относительно ваших кросс-платформенных проблем. – Matt

+0

Nice add. Третий предмет передает то, что меня больше всего волнует. В моем конкретном случае я проверил 'java -version' на удаленном хосте, и это было 1.8, поэтому на сегодняшний день не было бы проблем (июль 2016). Но спасибо, что указали на эту ссылку и как решить эту проблему в целом. – alisa

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

  • Нет связанных вопросов^_^