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



我正在尝试创建一个.bat文件来运行我生成的可执行JAR文件。我发现了这种创建.bat文件以运行项目的方法。因此,我在这里阅读了插件,并将以下内容添加到我的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

此外,我希望命令提示符在执行后保持不变。在这种情况下,它会立即关闭。也许是因为我犯了一个错误。我不确定。

所以,再次开始搜索并找到了这个。但正如公认的答案所表明的那样,我的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

我在这里做错了什么?

也许它与有关(来自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

其中CCD_ 10解析为CCD_。

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

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

我回到文档中找到了这个。

有时您会有很多依赖项,这意味着类路径非常长,并且变得太长(尤其是在基于Windows的平台上)。这种选择在这种情况下会有所帮助。如果激活此选项,则类路径仅包含一个类路径通配符(REPO/*)。但请注意,这只能与Java 1.6及更高版本以及repositoryLayoutflat结合使用。

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

<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的存储库布局已经很平坦了。没有层次结构。无需进行其他更改。批处理文件现在的行为与预期一致。

最新更新