2016-09-02 2 views
1

Я создаю проект maven с нуля, сначала просто научитесь использовать maven. Основной проект не содержит файла исходного кода, но он имеет два модуля (приложение и утилита). Приложение зависит от использования. Я хотел бы иметь .jar из приложения и не иметь файла манифеста, если это возможно. Я могу скомпилировать весь проект с помощью mvn clean install, но не могу запустить приложение с консоли.Проект Maven java строит, но не работает

Основной проект .pom является

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>com.proba</groupId> 
    <artifactId>myproject</artifactId> 
    <version>0.0.1</version> 
<packaging>pom</packaging> 


<modules> 
    <module>util</module> 
    <module>app</module> 
</modules> 
</project> 

Util .pom является

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.proba</groupId> 
    <artifactId>myproject</artifactId> 
    <version>0.0.1</version> 
    </parent> 
    <artifactId>util</artifactId> 


<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

</project> 

приложение ПОМ является

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.proba</groupId> 
     <artifactId>myproject</artifactId> 
     <version>0.0.1</version> 
    </parent> 
    <artifactId>app</artifactId> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.proba</groupId> 
      <artifactId>util</artifactId> 
      <version>0.0.1</version> 
      <scope>compile</scope> 
     </dependency> 
    </dependencies> 

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

      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.1.1</version> 
       <executions> 
        <execution> 
         <phase>site-deploy</phase> 
         <goals> 
          <goal>java</goal> 
         </goals> 
         <configuration> 
          <mainClass>com.proba.app.App</mainClass> 
          <!--<arguments> <argument>myArg1</argument> <argument>myArg2</argument> 
           </arguments> --> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Код не делает слишком много. App.java (внутри модуля приложения) - package com.proba.app;

import com.proba.util.UtilClass; 
public class App 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Hello World!"); 
     UtilClass uc = new UtilClass(); 
     System.out.println("QQQQQ: " + uc.print()); 
    } 
} 

я скомпилировать его с

mvn clean install 
[INFO] Reactor Summary: 
[INFO] 
[INFO] myproject .......................................... SUCCESS [ 0.406 s] 
[INFO] util ............................................... SUCCESS [ 2.074 s] 
[INFO] app ................................................ SUCCESS [ 0.535 s] 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 

MyProject, Util, приложение УСПЕХ.

Я пытаюсь запустить его с

java -jar app/target/app-0.0.1.jar 
Hello World! 
Exception in thread "main" java.lang.NoClassDefFoundError: com/proba/util/UtilClass 
     at com.proba.app.App.main(App.java:17) 
Caused by: java.lang.ClassNotFoundException: com.proba.util.UtilClass 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 1 more 

Как вы можете видеть, Hello World! распечатывается, но UtilClass не найден. Я могу запустить сборку из затмения, но не с консоли. Что я делаю неправильно? Есть ли у вас какие-либо идеи?

+0

Что произойдет, если вы запустите сборку с консоли? –

+0

Попробуйте запустить банку непосредственно из целевого каталога - я собираюсь угадать, что это связано с тем, где утилита jar относится к текущему рабочему каталогу. – Gimby

+0

Gimby: для этого я получаю тот же результат: cd util/target/then java -jar ../../app/target/app-0.0.1.jar Hello World! Исключение из потока «main» java.lang.NoClassDefFoundError: com/proba/util/UtilClass – thamas

ответ

0

Что вам не хватает в банке UtilClass. Вам просто нужно добавить плагин тени в ваш pom. В качестве ссылки: maven-shade-plugin

+0

Не могли бы вы быть более конкретными? Должен ли я добавить его, в котором пом? Утилита или приложение или основной проект. – thamas

+0

@thamas основной проект – lege

+0

Отлично! Это решило это. Теперь я получил ожидаемую распечатку на консоли: «java -jar app/target/app-0.0.1.jar Hello World! QQQQQ: Hello World from Module Util!" Большое спасибо! (Принял этот ответ.) – thamas

-1

В pom.xml модуля приложения у вас есть сводный компилятор, поэтому во время выполнения ваша банка не попадает в путь к классам. Удалите строку компиляции. И она будет работать.

+0

Я пробовал без него и с предоставленным и т. Д. Это не работает. – thamas

-1

Util.jar добавлен в ваше приложение pom.xml как зависимость, но область скомпилирована. Таким образом, он не добавляется в ваш манифест как запись класса. Удалите элемент области, а затем попробуйте.

+0

java -cp util/target/util-0.0.1.jar -jar app/target/app-0.0.1.jar дает тот же результат к несчастью. Поскольку я знаю, что java игнорирует «-cp», используется «-jar». – thamas

+0

Его широко документировано, что -cp не имеет эффекта при запуске приложения с -jar. Путь к классам определен в манифесте jar, так что он также может работать, когда вы просто дважды щелкаете по исполняемой банке. – Gimby

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