我为Java库添加了CLI支持,如何方便地向我的库用户公开此支持?

时间:2018-12-04 20:38:45

标签: java command-line-interface console-application

我维护了一个Java库,该库最近添加了对CLI命令的支持,但是我在理解如何真正暴露这种支持方面遇到了麻烦。

如何提供一个简单的命令跨平台,该平台可以处理所有需要的依赖项?

在我自己的测试期间,我要么依赖于从IntelliJ运行的Junit测试,要么依赖于Maven exec插件。 IntelliJ和Maven管理所有依赖项,但是我不能期望我的库用户也这样做。我正在考虑为Windows用户提供一个.bat文件,为Linux用户提供一个alias,它们是以下操作的快捷方式:

java -cp all;the;jars.jar my.package.CliSupportingClass command --option value

有更好的方法吗?

2 个答案:

答案 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也有类似的东西。