如何使用运行JAR的Maven Appassembler创建.bat文件?

时间:2016-05-30 06:23:08

标签: java maven batch-file jar

我正在尝试创建一个.bat文件来运行我生成的可执行JAR文件。我找到了创建.bat文件的this方法来运行项目。所以,我读了插件here并将以下内容添加到我的pom.xml

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>assemble</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <assembleDirectory>${assembleDir}</assembleDirectory>
        <generateRepository>false</generateRepository>
        <repositoryName>lib</repositoryName>
        <configurationDirectory>conf</configurationDirectory>
        <copyConfigurationDirectory>false</copyConfigurationDirectory>
        <programs>
            <program>
                <mainClass>com.companyname.tests.TestRunner</mainClass>
                <id>AutoConfigTest</id>
            </program>
        </programs>
    </configuration>
</plugin>

而且,是的,顾名思义,这个JAR包含JUnit测试用例。

我阻止插件解压缩JAR并创建repo文件夹并将其设置为我已生成的lib文件夹,该文件夹包含所有JAR(可执行文件和依赖项)。正在生成.bat文件,但在运行时,我收到以下错误。

Error: Could not find or load main class com.companyname.tests.TestRunner

另外,我希望命令提示符在执行后保留。在这种情况下,它立即关闭。也许是因为我收到了错误。我不确定。

所以,再次进行搜索并找到this。但正如接受的答案所示,我的pom.xml已经包含 -

<packaging>jar</packaging>

汇编目录是 -

AutoConfigTest
 |
 |--bin
 |   `- contains the .bat file
 |--conf
 |   `- contains the property files and other configuration files
 |--lib
     `- contains all the JARs

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

可能与(来自README.md

有关
  

项目本身的所有依赖项和工件都放置在已定义汇编目录中的生成的Maven存储库中。所有工件(依赖项+项目中的工件)都会添加到生成的bin脚本中的类路径中。

pom.xml中,您阻止生成该存储库。因此,您需要确保将项目中的工件复制到预期的位置。

假设有以下项目设置

<groupId>com.companyname</groupId>
<artifactId>Maven-AppAssembler</artifactId>
<version>0.0.1-SNAPSHOT</version>

工件应该在(脚本bin/AutoConfigTest中的CLASSPATH设置)

"$REPO"/com/companyname/Maven-AppAssembler/0.0.1-SNAPSHOT/Maven-AppAssembler-0.0.1-SNAPSHOT.jar

$REPO解析为target/appassembler/lib

答案 1 :(得分:0)

我发现了这个问题。 @SubOptimal指出主要类对批处理文件不可见是正确的。

由于某种原因,测试JAR文件(包含主类)未添加到批处理文件的classpath变量中。因此,每当我运行批处理文件时,我都会收到问题中提到的错误。

我回到文档并找到this

  

有时会发生许多依赖关系,这意味着拥有一个非常长的类路径,并且变得太长(特别是在基于Windows的平台上)。此选项可以在这种情况下提供帮助。如果激活此选项,则类路径仅包含类路径通配符(REPO/*)。但请注意,这仅适用于Java 1.6及更高版本以及repositoryLayout flat

因此,我没有将单个JAR文件添加到路径中,而是将整个lib目录添加到类路径中,方法是将以下内容添加到pom.xml

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.10</version>
    ...
    <configuration>
        ...
        <repositoryLayout>flat</repositoryLayout>
        <useWildcardClassPath>true</useWildcardClassPath>
        ...
    </configuration>
    ...
</plugin>

我可以这样做,因为lib的存储库布局已经是平坦的。没有等级制度。无需其他更改。批处理文件现在按预期运行。