Java Main类:Manifest-如何使用参数定义入口点

Java Main类:Manifest-如何使用参数定义入口点,java,class,arguments,parameter-passing,manifest,Java,Class,Arguments,Parameter Passing,Manifest,我有一个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.Te

我有一个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);

        }
}

我做错了什么?为什么我不能在没有args的情况下使用jar文件执行Start来执行原始类TestDFIO?谢谢

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

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

您也可以编写一个包装shell脚本来完成这一部分


在不知道为什么需要这样做的情况下,提供可行的想法就更加困难了。

我是否达到了jar配置不同可能性的极限?:-)我认为您的解决方案类型称为wrapper.:)我刚刚注意到您的问题已经有了这个解决方案。无论如何,我认为这是唯一的解决方案。我使用一个工具来执行我的jar文件,它不提供任何提供参数的机会。它应该是一个jar文件,可以用jar myjarfile.jar执行。就这样,没有更多的并发症。我只能执行jar文件。听起来很奇怪。唯一的方法是用另一个类创建另一个jar,用参数调用所提到的类?@Bob什么工具(a)只允许您运行jar,并且(b)没有命令行参数的规定?获取新工具。我不知道你的选择是什么,虽然你可以执行它。这个解决方案是可行的,但我同意@DaveNewton,你使用的工具似乎更多的是一个障碍而不是一个帮助!