【问题标题】:Main-Class: Manifest - how to define an entry point with argumentsMain-Class: Manifest - 如何使用参数定义入口点
【发布时间】:2012-06-15 06:56:31
【问题描述】:

我有一个 jar 文件,其清单文件中有预定义的入口点。并且可以成功执行。

hadoop jar hadoop-test-1.0.2.jar -write -nrFiles 1 -fileSize 10
TestDFSIO.0.0.4
12/06/11 21:35:09 INFO fs.TestDFSIO: nrFiles = 1
12/06/11 21:35:09 INFO fs.TestDFSIO: fileSize (MB) = 10
12/06/11 21:35:09 INFO fs.TestDFSIO: bufferSize = 1000000
12/06/11 21:35:09 INFO fs.TestDFSIO: creating control file: 10 mega bytes, 1 files
12/06/11 21:35:09 INFO fs.TestDFSIO: created control files for: 1 files
12/06/11 21:35:10 INFO mapred.FileInputFormat: Total input paths to process : 1
12/06/11 21:35:10 INFO mapred.JobClient: Running job: job_201206110904_0029
12/06/11 21:35:11 INFO mapred.JobClient:  map 0% reduce 0%
12/06/11 21:35:25 INFO mapred.JobClient:  map 100% reduce 0%
12/06/11 21:35:37 INFO mapred.JobClient:  map 100% reduce 100%
...

现在我关心的是如何在没有选项的情况下执行 jar。 我的意思是我只想调用:

hadoop jar hadoop-test-1.0.2.jar

我需要在 jar 文件中以某种方式定义像 "-write -nrFiles 1 -fileSize 10" 这样的参数。但是怎么做呢?

如何在清单文件中定义它?我知道我可以生成自己的类,然后使用这些参数启动测试类。但是还有其他解决方法吗?

令人惊讶的是:定义了一个类,它使用 args 调用所需的类。

执行尝试:

hadoop jar hadoop-test-1.0.2.jar 
RunJar jarFile [mainClass] args...

类名为arg,就可以了!

hadoop jar hadoop-test-1.0.2.jar Start
TestDFSIO.0.0.4
12/06/12 01:05:11 INFO fs.TestDFSIO: nrFiles = 10
12/06/12 01:05:11 INFO fs.TestDFSIO: fileSize (MB) = 1000
12/06/12 01:05:11 INFO fs.TestDFSIO: bufferSize = 1000000
12/06/12 01:05:11 INFO fs.TestDFSIO: creating control file: 1000 mega bytes, 10 files
12/06/12 01:05:11 INFO fs.TestDFSIO: created control files for: 10 files
12/06/12 01:05:11 INFO mapred.FileInputFormat: Total input paths to process : 10
12/06/12 01:05:12 INFO mapred.JobClient: Running job: job_201206110904_0033
...

我的清单内容:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.1-b02 (Sun Microsystems Inc.)
Main-Class: Start

Name: org/apache/hadoop
Implementation-Title: Hadoop
Implementation-Version: 1.0.2
Implementation-Vendor: Apache

Start.java的内容:

import org.apache.hadoop.fs.TestDFSIO;
public class Start {

        public static void main(String[] args) throws Exception{
                String [] myargs  = {"-write","-nrFiles","10","-fileSize","1000"};

                TestDFSIO.main(myargs);

        }
}

我做错了什么?为什么我无法执行 Start using the jar file without args 来执行原始类 TestDFIO?谢谢!

【问题讨论】:

    标签: java class arguments parameter-passing manifest


    【解决方案1】:

    不。您可以创建一个新的main 方法或从其他地方获取参数,例如配置文件、环境变量等。

    您也可以只编写一个包装外壳脚本来完成该部分。

    不知道为什么你需要这样做,就很难提供可操作的想法。

    【讨论】:

    • 我使用一个工具来执行我的 jar 文件,它没有提供任何提供参数的机会。它应该是一个 jar 文件,可以使用 jar myjarfile.jar 执行。就是这样,没有更多的并发症。我只能执行jar文件。听起来很奇怪。唯一的方法是创建另一个 jar,其中另一个类使用参数调用提到的类?
    • @Bob 什么工具(a)只允许你运行 jars,而(b)没有提供命令行参数?获得新工具。我看不出你有什么选择,尽管你可以执行它。
    • 此解决方案有效,但我同意@DaveNewton 的观点,您使用的工具似乎更像是一个障碍而不是帮助!
    【解决方案2】:

    你不能那样做。相反,您可以尝试创建另一个没有参数的主类,使用您需要的参数调用原始主类。

    【讨论】:

    • 我是否达到了 jar 配置的不同可能性的极限? :-)
    • 我认为您的解决方案类型称为包装器。
    • :) 我刚刚注意到您的问题已经有了这个解决方案。无论如何,我认为这是唯一的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多