java - 主类: Manifest - how to define an entry point with arguments

标签 java class arguments parameter-passing manifest

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

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" 。但如何呢?

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

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

执行尝试:

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
...

我的 list 内容:

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);

        }
}

我做错了什么?为什么我无法使用不带参数的 jar 文件执行 Start 来执行原始类 TestDFIO?谢谢!

最佳答案

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

您也可以编写一个封装 shell 脚本来完成该部分。

如果不知道为什么您需要这样做,就很难提供可行的想法。

关于java - 主类: Manifest - how to define an entry point with arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995879/

相关文章:

java - 如何在匿名类中访问变量?

java - BouncyCaSTLe 版本冲突,厂商不合作

java - 如何比较枚举值?

jQuery Cycle 插件,将类添加到当前幻灯片缩略图/链接

php - C++ 是否可以将带有换行符的文本传递给 C++ 程序?

java - LU 分解方法中线程 "main"java.lang.NullPointerException 异常

java - for 循环在已编译的类文件中转换为 do while 循环

java - Java中如何将参数从一个类传递到另一个类?

python - boost python的指针参数

php - 为 foreach() 提供的无效参数哪里出错了?