代码之家  ›  专栏  ›  技术社区  ›  Peter Kofler

是否有一个Java库将命令文件转换成main方法的参数

  •  0
  • Peter Kofler  · 技术社区  · 14 年前

    我在做一个(codehaus)maven 2 mojo。不幸的是,被调用的逻辑有一个不兼容的许可证,我必须派生一个单独的进程(就像对cobertura maven插件所做的那样)。

    分叉本身很容易使用 org.codehaus.plexus.util.cli.Commandline 和朋友们。fork需要能够为被调用进程的主方法设置数千个参数(这是要使用的第三方代码)。在Windows上, Commandline 只能是8公里长。使用直接拨叉( Runtime.getRuntime().exec )最多只支持32K的参数总大小,这仍然是不够的。

    所以我需要一个第三方工具的包装器,它从一个文本文件(命令文件)中读取行并用它们调用目标类。 这很容易编码,我可以自己做 但是我还有另一个类调用第三方代码,由于许可证问题(如上所述),该代码不能在mojo的代码库中。最好是一个图书馆,我可以把它作为一个对我有帮助的依赖。

    你知道我可以使用这样的库/类吗(不需要设置另一个需要发布bla bla bla的项目)。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Peter Kofler    14 年前

    显然(正如没有人回答的那样),开箱即用是不可能的。所以我不得不自己想出一个。

    • 创建我复制的命令行文件 net.sourceforge.cobertura.util.CommandLineBuilder ( source addArg() , saveArgs() getCommandLineFile() 方法。
    • 使用我使用的文件执行命令行 org.codehaus.plexus.util.cli.Commandline 如Mojos中常用的。

      Commandline cl = new Commandline();
      cl.setExecutable( COMMAND_CLASS );
      cl.createArg().setValue( TASK_CLASS );
      
      CommandLineBuilder builder = new CommandLineBuilder( "macker" );
      for ( Iterator/*<String>*/it = options.iterator(); it.hasNext(); ) {
         builder.addArg( (String) it.next() );
      }
      builder.saveArgs();
      String commandsFile =  builder.getCommandLineFile();
      cl.createArg().setValue( commandsFile );
      
      StringStreamConsumer stdout = new StringStreamConsumer();
      StringStreamConsumer stderr = new StringStreamConsumer();
      int exitCode = CommandLineUtils.executeCommandLine( cl, stdout, stderr );
      
    • “另一方”必须解包这些参数。我写了一个小班 CommandLineFile ( source 为此。

      String className = args[0];
      Class clazz = Class.forName( className );
      Method main = clazz.getMethod( "main", new Class[] { String[].class } );
      
      List/*<String>*/lines = new ArrayList/*<String>*/();
      Reader in = new InputStreamReader( new FileInputStream( args[1] ), "UTF-8" );
      try {
          lines = IOUtils.readLines( in );
      } finally {
          in.close();
      }
      
      main.invoke( null, new Object[] { lines.toArray( new String[lines.size()] ) } );
      
    • 唯一的问题是 命令行文件 在类路径上。但那是另一个故事…

    所有使用的类都是通用的和开源的。所以它们可以用于任何分叉问题。