2014-07-16 33 views
0

我是新来的Maven,并有与下面的目录结构如何创建可执行的JAR文件,包括依赖性,其中主类是在测试,使用Maven

project 

-src 
    -main 
    -java 
     -org 
     -core 
      -starter.java 
    -test 
    -java 
     -org 
     -core 
      -testStarter.java 

两个starter.java和testStarter项目.java是主类。不过,我希望创建一个可执行的jar文件(包括依赖关系),在其中执行testStarter.java。

添加以下到我的POM文件:

<groupId>org</groupId> 
<artifactId>proj</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>project</name> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>org.core.testStarter</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    <plugins> 
</build> 

但是每次我运行mvn清洁套装,它创建了一个包,只有在主目录,而不是test目录下的编译的类。因此,每次运行jar文件时,它都不会运行,因为testStarter.class不存在于创建的jar文件中。

有没有一种方法,我可以创建一个包含测试和主要的类或者

1)一个大的jar文件,而它仅执行测试类

2)只测试类,但所有的依赖都包括在内。

+0

发表您的整个pom.xml的 –

+0

我有更新了pom部分以显示迄今为止我所有的构建依赖关系。 –

回答

2

根据你pom.xml你已经有一个大罐子清单中所有的依赖和正确的类名。

你现在需要的是你的测试类包括成神器。

  1. 一个大的jar文件包含测试和主类,而它只执行测试类。您可以指定/src/test目录作为另一个源目录(见Maven compile with multiple src directories)。
  2. 只有测试类,但所有的依赖都包括在内。您可以通过在建部分使用sourceDirectory标签标记您的测试目录作为唯一的源目录。但我想,您的测试取决于main中的代码,因此此配置可能会在编译时失败。

p.s.我强烈建议你为这种情况创建单独的构建配置文件,因为我在测试类中使用jar的主要方法似乎很奇怪。

2

嗯,这似乎有点儿奇怪,但你可以做的就是把testStartermain(我想这是行不通的,因为它有test目录下的其他类的引用,对吗?)。顺便说一句,使用CapitalCamelCase类名,这是更多的Java-ISH。

或者,您可以使用test-jar创建测试罐(如果加上原来的罐子到Class-Path清单属性这可能工作),或者你就可以开始你的黑客项目的whole assembly,但我不会建议。

我会建议重新思考你的项目布局和澄清您的要求。可能你不需要这个过程。

+0

实际上有一个主要的课程在测试和主要是一个项目需求。 是的,我不能把testStarter放在main下面。 –

2

我推荐使用Maven的OneJar插件,

这里看看:https://code.google.com/p/onejar-maven-plugin/

“让您建立与Maven2的一个可执行的JAR,包含所有依赖” 你确定范围

至于发出─ - 您需要将该Main类移动到src文件夹,以便它可以位于编译范围内。

干杯!

2

我们在我们的项目中通过使用maven-assembly-plugin的assembly.xml来实现这一点。 在POM我们:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <descriptors> 
       <descriptor>src/main/resources/assembly.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
       <id>package-jar-with-dependencies</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

再就是在src /主/资源assembly.xml告诉如何构建组件:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>bin</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <!-- Adds dependencies to jar package under lib directory --> 
    <dependencySets> 
     <dependencySet> 
      <useProjectArtifact>true</useProjectArtifact> 
      <outputDirectory></outputDirectory> 
      <unpack>true</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 
相关问题