maven-assembly-plugin 前置到类路径

maven-assembly-plugin prepending to classpath

我有一个模块,我正在使用 maven-assembly-plugin 创建一个具有依赖项的可执行 jar。当我 运行 安装时,插件会在 jar 名称和所有 jar 内容之前添加项目名称 ("vicinity"),即:

$ jar -tvf vicinity-confirm-assets.jar | more
     0 Tue Jan 20 17:18:10 EST 2015 META-INF/
   213 Tue Jan 20 17:18:08 EST 2015 META-INF/MANIFEST.MF
     0 Tue Jan 20 17:18:10 EST 2015 vicinity/
     0 Thu Nov 13 20:52:16 EST 2014 vicinity/META-INF/
   134 Thu Nov 13 20:52:14 EST 2014 vicinity/META-INF/MANIFEST.MF
     0 Thu Nov 13 20:52:06 EST 2014 vicinity/org/
     0 Thu Nov 13 20:52:10 EST 2014 vicinity/org/boon/
     0 Thu Nov 13 20:52:10 EST 2014 vicinity/org/boon/cache/
     0 Thu Nov 13 20:52:10 EST 2014 vicinity/org/boon/collections/
     0 Thu Nov 13 20:52:10 EST 2014 vicinity/org/boon/concurrent/
    ...
     0 Tue Jan 20 17:17:50 EST 2015 vicinity/META-INF/maven/com.thingy.webapp/confirmassets/
  2208 Tue Jan 20 17:17:44 EST 2015 vicinity/META-INF/maven/com.thingy.webapp/confirmassets/pom.xml
   127 Tue Jan 20 16:25:22 EST 2015 vicinity/META-INF/maven/com.thingy.webapp/confirmassets/pom.properties

这是插件xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.thingy.webapp.confirmassets.ToolbarResourcesUrlTester</mainClass>
                    </manifest>
                </archive>
                <descriptors>
                    <descriptor>src/main/resources/dist.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这里是 dist.xml:

<?xml version='1.0' encoding='UTF-8'?>
<assembly>
    <id>confirm-assets</id>
    <formats>
        <format>jar</format>
    </formats>

    <dependencySets>
        <dependencySet>
            <scope>runtime</scope>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>**/LICENSE*</exclude>
                    <exclude>**/README*</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/resources/META-INF/services</directory>
            <outputDirectory>META-INF/services</outputDirectory>
        </fileSet>
    </fileSets>    
</assembly>

预计到达时间:"vicinity" 前缀来自父 pom 的 <build><finalName>vicinity</finalName>...</build>。但是将它添加到 jar 中包含的每个文件和依赖项之前是没有意义的。我尝试在我的模块的 pom 中用一个空的 <finalName></finalName> 标记覆盖,但随后我得到了一个破折号。我如何完全摆脱它,只在 jar 中包含正确命名的内容?

另外:我遇到的问题是,当我尝试从命令行 运行 我的主要 class 时,我得到:

 $ java -jar vicinity-confirm-assets.jar 
Error: Could not find or load main class com.thingy.webapp.confirmassets.ToolbarResourcesUrlTester

此外,还有两个 MANIFEST.MF 文件。

$ jar -tvf vicinity-confirm-assets.jar | grep MANI
   213 Tue Jan 20 18:07:26 EST 2015 META-INF/MANIFEST.MF
   134 Thu Nov 13 20:52:14 EST 2014 vicinity/META-INF/MANIFEST.MF

第一个:

Manifest-Version: 1.0
Built-By: barclaydunn
Build-Jdk: 1.6.0_65
Created-By: Apache Maven 3.1.1
Main-Class: com.thingy.webapp.confirmassets.ToolbarResourcesUrlTest
 er
Archiver-Version: Plexus Archiver

第二个:

Manifest-Version: 1.0
Built-By: slandelle
Build-Jdk: 1.7.0_65
Created-By: Apache Maven 3.2.2
Archiver-Version: Plexus Archiver

我猜有两个原因,并且前置来自于这是一个子模块这一事实。第二个是来自父 pom,我猜。

我是否正在尝试做一些不能/不应该做的事情?

万一其他人遇到这个问题,我发现您可以控制 dist.xml 中的 <includeBaseDirectory>false</includeBaseDirectory> 是否包含基本目录:

<?xml version='1.0' encoding='UTF-8'?>
<assembly>
    <id>confirm-assets</id>
    <formats>
        <format>jar</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>
    ...

有关详细信息,请参阅 http://maven.apache.org/plugins/maven-assembly-plugin/advanced-descriptor-topics.html#Using_an_Alternative_Assembly_Base_Directory