我维护了一个Java库,该库最近添加了对CLI命令的支持,但是我在理解如何真正暴露这种支持方面遇到了麻烦。
如何提供一个简单的命令跨平台,该平台可以处理所有需要的依赖项?
在我自己的测试期间,我要么依赖于从IntelliJ运行的Junit测试,要么依赖于Maven exec插件。 IntelliJ和Maven管理所有依赖项,但是我不能期望我的库用户也这样做。我正在考虑为Windows用户提供一个.bat文件,为Linux用户提供一个alias,它们是以下操作的快捷方式:
java -cp all;the;jars.jar my.package.CliSupportingClass command --option value
有更好的方法吗?
答案 0 :(得分:1)
This article很好地解释了这一点,使用appassembler-maven-plugin组装所有依赖项并生成脚本帮助程序,然后使用maven-assembly-plugin将其捆绑为一个压缩文件,例如zip和tar。
本文使用其中一个插件的2.4版,我在其中更新了最新的3.1.0。我们使用情况的唯一区别是<descriptor>
标签现在嵌套在<descriptors>
标签中。
将两个插件都作为标准构建插件或在配置文件中包含:
<profiles>
<profile>
<id>standalone-cli</id>
<build>
<plugins>
<!-- appassembler-maven-plugin -->
<!-- maven-assembly-plugin -->
</plugins>
</build>
</profile>
</profiles>
appassembler-maven-plugin 为我们收集所有依赖关系,并为Windows和Unix生成脚本帮助器:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.8.1</version>
<configuration>
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<showConsoleWindow>true</showConsoleWindow>
<platforms>
<platform>unix</platform>
<platform>windows</platform>
</platforms>
<programs>
<program>
<mainClass>org.simplejavamail.cli.SimpleJavaMail</mainClass>
<id>sjm</id>
</program>
</programs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
maven-assembly-plugin 然后生成档案:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptors>
<descriptor>src/assembly/standalone-cli-descriptor.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
最后, standalone-cli-descriptor.xml 告诉maven-assembly-plugin归档中应包含什么以及应产生什么type of archives:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>standalone-cli</id>
<formats>
<format>tar</format>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>LICENSE-2.0.txt</include>
<include>NOTICE.txt</include>
<include>RELEASE.txt</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/appassembler</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**/**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
答案 1 :(得分:0)
Gradle有一个application
plugin ,用于创建分发zip文件。您的用户可以将其解压缩以安装它。它具有lib
文件夹中的所有依赖项以及Windows bat文件和* nix shell脚本,可以在bin
文件夹中运行应用程序。
我相信Maven也有类似的东西。