2016-09-02 33 views
1

我从头开始创建一个Maven项目,首先学习如何使用Maven。 主项目不包含源代码文件,但它有两个模块(app和util)。应用程序取决于util。我想从应用程序获取.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> 

应用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>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 

正如你所看到的,世界您好运行它!打印出来,但找不到UtilClass。 我能够从eclipse运行构建,但不能从控制台运行。 我做错了什么?你有什么主意吗?

+0

如果从控制台运行构建,会发生什么情况? –

+0

尝试直接从目标目录运行jar - 我猜它必须处理util 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的jar。你只需要在你的pom中添加阴影插件。 作为参考:maven-shade-plugin

+0

你能更具体吗?我应该添加它在哪些POM? Util或应用程序或主项目。 – thamas

+0

@thamas主项目 – lege

+0

太棒了!这解决了它。现在我在控制台中得到了预期的打印输出:“java -jar app/target/app-0.0.1.jar Hello World! QQQQQ:Module Util的Hello World!” 非常感谢! (接受此答案。) – thamas

-1

在应用程序模块的pom.xml中,您已经编写了这个编译器,它说明了为什么在运行时您的jar没有进入classpath.Remove compile line.And它会工作。

+0

我试过没有它,并提供了,等等。这些都不起作用。 – thamas

-1

Util.jar作为依赖项添加到您的应用程序pom.xml中,但范围是编译的。所以它不会被添加到你的Manifest作为类路径条目。删除范围元素,然后尝试。

+0

java -cp util/target/util-0.0.1.jar -jar app/target/app-0.0.1.jar给出了不幸的相同结果。据我所知,java忽略“-cp”是使用“-jar”。 – thamas

+0

其广泛记载的是,使用-jar运行应用程序时,-cp无效。 classpath是在jar的清单中定义的,所以当你双击可运行jar时,它也可以工作。 – Gimby