【问题标题】:How to create .bat files using Maven Appassembler that runs a JAR?如何使用运行 JAR 的 Maven Appassembler 创建 .bat 文件?
【发布时间】:2016-05-31 12:36:44
【问题描述】:

我正在尝试创建一个.bat 文件来运行我生成的可执行 JAR 文件。我找到了 this 创建 .bat 文件以运行项目的方法。所以,我阅读了插件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

我在这里做错了什么?

【问题讨论】:

  • 是的,question you mention 看起来和你的一模一样。接受的解决方案很奇怪,因为jar 是默认包装。您是否尝试过其他解决方案和建议?似乎有几件事可能会出错,而彼此的答案解决了其中一件事情。
  • 生成的.bat文件内容是什么? lib/ 中的任何 .jar 文件是否包含您的课程 com.companyname.tests.TestRunner
  • @SubOptimal 是的,包含com.companyname.tests.TestRunner 的jar 存在于lib 文件夹中。我已经检查过了。
  • @BileshGanguly 我认为它不在脚本AutoConfigTest.bat 期望的地方。看看我的回答。
  • @SubOptimal 我已经将依赖项添加到类路径中。请查看生成的批处理文件。我已经更新了问题。

标签: java maven batch-file jar


【解决方案1】:

可能与(来自README.md)有关

项目本身的所有依赖项和工件都放置在生成的 Maven 存储库中 定义的 assemble 目录中。所有工件(依赖项 + 项目中的工件)都添加到生成的 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

【讨论】:

  • 我想我发现了错误。您指出主类对批处理文件不可见是正确的。由于某种原因,没有将测试 jar 文件(包含主类)添加到批处理文件的类路径变量中。
【解决方案2】:

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

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

我回到文档,发现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 的存储库布局已经是平坦的。没有等级制度。无需进行其他更改。批处理文件现在按预期运行。

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 2013-03-29
    • 2014-04-01
    • 1970-01-01
    • 2015-02-06
    • 2012-07-01
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多