Java 如何从Maven项目(如mvn、gradle等)构建CLI?

Java 如何从Maven项目(如mvn、gradle等)构建CLI?,java,maven,command-line-interface,Java,Maven,Command Line Interface,例如,我有一个名为blabla的Maven项目,我希望通过类似mvn(Maven)或gradle的CLI来控制它(例如,$mvn clean install,$gradle init等) 而不是发射 $ java BlaBla start 或 等 我想这样做: $ blabla start $ blabla status $ blabla stop 等等 maven项目是否有现成的解决方案?对于maven,请查看,您可以执行以下操作: <project> ... <

例如,我有一个名为blabla的Maven项目,我希望通过类似mvn(Maven)或gradle的CLI来控制它(例如,
$mvn clean install,$gradle init
等)

而不是发射

$ java BlaBla start 

我想这样做:

$ blabla start
$ blabla status
$ blabla stop
等等


maven项目是否有现成的解决方案?

对于maven,请查看,您可以执行以下操作:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
          <execution>
            ...
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.mycompany.BlaBla</mainClass>
          <arguments>
            <argument>start</argument>
            ...
          </arguments>
          <systemProperties>
            <systemProperty>
              <key>myproperty</key>
              <value>myvalue</value>
            </systemProperty>
            ...
          </systemProperties>
        </configuration>
      </plugin>
    </plugins>
  </build>
   ...
</project>

...
org.codehaus.mojo

虽然我不知道与您的问题相关的具体用例,但使用bash脚本或其他专门设计用于运行软件的方式可能是一个更好的主意。Maven和Gradle是构建自动化工具,他们的主要目标不是运行程序,而是编译代码、运行测试和创建工件(以及其他东西)。

使用库。它是一个库,您可以像这样构建选项列表(参数、参数等)

 package CLi;

   import org.apache.commons.cli.CommandLine;
   import org.apache.commons.cli.CommandLineParser;
   import org.apache.commons.cli.DefaultParser;
   import org.apache.commons.cli.HelpFormatter;
   import org.apache.commons.cli.Options;
   import org.apache.commons.cli.ParseException;
   import org.apache.poi.EncryptedDocumentException;
   import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

 public class CLi 
   {
 /** 
        * @see http://www.thinkplexx.com/blog/simple-apache-commons-cli-example-            java-command-line-arguments-parsing
        * @see http://stackoverflow.com/a/10798945
        * @see http://stackoverflow.com/questions/36166630/apache-commons-cli-   not-parsing-as-expected
        * 
        * Link to Java-Library:
        * @see https://commons.apache.org/proper/commons-cli/   
        */

   /**
    * Variables
    */
   private String[] args;
   private Options options = new Options();
   private HelpFormatter formater;
   private CommandLineParser parser;
   private CommandLine cmd;
   private Scanner console; 
   private String cmdLine; 
   private boolean noParam;

   /**
    * Constructor.
    * @param args - The command-line arguments.
   */
   public CLi(String[] args) 
   {
       this.args = args;
       buildCLIOptions();
   }

  public void parse() throws Exception
  {
    if(args.length == 0)
    {
        noParam = true;
        args = scanParams();
    }
    else
    {
        try 
        {
            parser = new DefaultParser();

            cmd = null;
            cmd = parser.parse(options, args);      

            /**
             * Print help.
             */
            if (cmd.hasOption("help"))
            {
                noParam = false;
                help();
            }

            /**
             * Shutdown.
             */
            if (cmd.hasOption("exit")) 
            {
                noParam = false;
                System.exit(0);     
            }
        }
    }
}

/**
 * @throws Exception 
 */
public void help() throws Exception
{
    /**
     * This prints out some help
     */
    formater = new HelpFormatter();
    formater.printHelp("Main", options);
    System.out.println(" ");
    noParam = true;
    scanParams();
}

/**
 * Scan params.
 * @return the Parameters
 * @throws Exception 
 */
public String[] scanParams() throws Exception 
{
    System.out.println("Ready... Waiting for input...:");
    System.out.println(" ");

    console = new Scanner(System.in);

    while(noParam)
    {
        cmdLine = console.nextLine();

        args = cmdLine.replace(" -", " #-").split(" #");

        parse();
    }

    console.close();

    return args;
}

public void buildCLIOptions()
{
    options.addOption("exit", "exit", false, "Exiting application.");
    options.addOption("help", "help", false, "show help.");
}
}
在主类中,请执行以下操作:

public class Main
{       
    public static void main(String[] args) throws Exception 
    {
        CLi console = new CLi(args);
        console.parse();
    }
}

您可以看看,它可以根据名称创建脚本,并支持创建shell和bat变体…

我想您可以创建bat或其他脚本。@Stultuske从头开始?为什么不?你认为你需要多少行代码?如果我不懂bash怎么办?学习一下它没什么错非常有用的库,谢谢。但无论如何,我需要bash脚本从命令行启动。我决定创造它。是的,这正是我想要的。谢谢
public class Main
{       
    public static void main(String[] args) throws Exception 
    {
        CLi console = new CLi(args);
        console.parse();
    }
}