flink 命令行提交jar时,传入自定义的参数或配置文件,任务运行时获取参数

Flink提供ParameterTool类,从不同的来源读取参数

在这里插入图片描述

一.方法

1.fromArgs方法

  读取在命令行中传递的参数,注意传参 格式为 key value ,key必须以 - 或者 – 开头,如 --key1 value1 --key2 value2 -key3 value3
在这里插入图片描述

2.fromPropertiesFile方法

  读取Properties文件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.fromSystemProperties方法

  读取system properties,通过-Dkey1=value1 -Dkey2=value2传递
在这里插入图片描述

二.示例

1.命令行提交jar,自定义参数
public class Demo {
    public static void main(String[] args) throws Exception {
        final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        ParameterTool parameters = ParameterTool.fromArgs(args);
        String local_path = parameters.get("path",null);  //指定参数名:path
        DataSet<String> toFilter = env.fromElements(local_path);
        FlatMapOperator<String, String> flatMap = toFilter.flatMap(new RichFlatMapFunction<String, String>() {
            @Override
            public void flatMap(String value, Collector<String> out) throws Exception {
                String[] split = value.split(",");
                for(String s:split){
                    out.collect(s);
                }
            }
        });
        flatMap.print();
    }
}
public class Upjar {
    public static void main(String[] args) throws IOException {
        List<String> arg = new ArrayList<>();
        arg.add("sh");
        arg.add("-c");
        arg.add("./flink run  -p 2  -C file:///home/czFlinkDemo/target/czFlinkDemo-1.0-SNAPSHOT.jar  -c com.cz.dataset.wordCount.Demo /home/czFlinkDemo/target/czFlinkDemo-1.0-SNAPSHOT.jar -path  a,gh,jk,ui,o\n");
        ProcessBuilder pb = new ProcessBuilder(arg);
        //设置工作目录
        pb.directory(new File("/home/flink/flink-1.10.0/bin"));
        //redirectErrorStream 属性默认值为false,意思是子进程的标准输出和错误输出被发送给两个独立的流,可通过 Process.getInputStream() 和 Process.getErrorStream() 方法来访问
        //值设置为 true,标准错误将与标准输出合并。合并的数据可从 Process.getInputStream() 返回的流读取,而从 Process.getErrorStream() 返回的流读取将直接到达文件尾
        pb.redirectErrorStream(true);
        File log = new File("/mnt/htst/log/htst.log");
        pb.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
        Process p = pb.start();
        assert pb.redirectInput() == ProcessBuilder.Redirect.PIPE;
        //重定向标准输出到日志
        assert pb.redirectOutput().file() == log;
        assert p.getInputStream().read() == -1;

    }
}

注意: 把自定义的传参放到命令行的最后
在这里插入图片描述
在这里插入图片描述

2.本地自定义参数
public class StreamWordCount {
    public static void main(String[] args) throws Exception {
        //创建流式执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
      //从参数中提取主机名和端口号
        ParameterTool parameterTool = ParameterTool.fromArgs(args);
        String host = parameterTool.get("host");
        int port = parameterTool.getInt("port");
        //读取文本流
        DataStreamSource<String> stringDataStreamSource = env.socketTextStream(host, port);

        //转换
        SingleOutputStreamOperator<Tuple2<String, Long>> streamOperator = stringDataStreamSource.flatMap(new FlatMapFunction<String, Tuple2<String, Long>>() {
            @Override
            public void flatMap(String s, Collector<Tuple2<String, Long>> collector) throws Exception {
                String[] words = s.split(" ");
                for (String word :
                        words) {
                    collector.collect(Tuple2.of(word, 1L));
                }
            }
        }).returns(Types.TUPLE(Types.STRING, Types.LONG));
        KeyedStream<Tuple2<String, Long>, String> keyBy = streamOperator.keyBy(new KeySelector<Tuple2<String, Long>, String>() {
            @Override
            public String getKey(Tuple2<String, Long> stringLongTuple2) throws Exception {

                return stringLongTuple2.f0;
            }
        });
        SingleOutputStreamOperator<Tuple2<String, Long>> sum = keyBy.sum(1);
        sum.print();
        env.execute();
    }
}

定义参数
在这里插入图片描述
socket流:
在这里插入图片描述
在这里插入图片描述

<think>嗯,用户问的是如何在命令行中正确运行JAR包文件,用java -jar命令。首先,我需要回忆一下自己之前学过的关于Java打包和运行的知识。记得运行JAR包的基本命令是java -jar filename.jar,但有候会遇到问题,比如找不到主类者依赖项缺失。 根据用户提供的引用,特别是引用[4]提到,MavenEclipse导出的JAR可能无法运行是因为没有指定主类。这候需要检查MANIFEST.MF文件中的Main-Class属性是否正确设置。所以,用户可能需要确保他们的JAR包已经正确配置了主类。 另外,引用[3]中提到了jar命令的不同参数,比如-c创建、-t列出内容等。但用户的问题是关于运行,所以可能需要指导他们如何生成带有正确清单文件的JAR包,者在命令行中显式指定主类。 还有,引用[2]提到了使用-Djava.ext.dirs参数来指定依赖库目录,如果JAR包依赖外部库,用户可能需要用这个参数者-classpath选项来包含所有依赖项。例如,java -cp "myapp.jar;libs/*" com.example.MainClass。 用户可能遇到的问题包括:1)没有主类清单属性,2)缺少依赖库,3)JAR文件损坏。需要针对这些情况逐一给出解决方案。比如,当运行java -jar出现“no main manifest attribute”错误,就需要重新打包并指定主类,者用java -cp命令显式指定主类。 另外,引用[1]中的后台运行方法,比如使用javaw者批处理文件,用户可能是在Windows环境下,可能需要这些方法来让JAR在后台运行而不显示命令行窗口。 总结步骤应该是:1)使用java -jar运行,检查错误信息;2)根据错误处理,比如重新打包指定主类,添加依赖路径;3)其他运行方式,如显式指定主类用脚本后台运行。同,要提醒用户检查JAR包结构是否正确,确保所有依赖都被包含。</think>### 如何在命令行中正确运行JAR包? #### 步骤1:基础命令 运行JAR包的基本命令格式为: ```cmd java -jar [JAR文件路径] ``` 例如: ```cmd java -jar D:\project\myapp.jar ``` 如果提示`no main manifest attribute`,说明JAR包的清单文件未指定主类[^4]。 --- #### 步骤2:修复主类缺失问题 **方法1:通过MavenIDE生成可执行JAR** 在Maven的`pom.xml`中添加插件配置,确保生成包含主类的清单文件: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>com.example.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` **方法2:手动指定主类** 如果清单文件未配置主类,可通过以下命令显式指定: ```cmd java -cp myapp.jar com.example.MainClass ``` --- #### 步骤3:处理依赖问题 若JAR依赖外部库,需通过`-classpath``-Djava.ext.dirs`包含依赖路径: ```cmd java -Djava.ext.dirs=libs -jar myapp.jar ``` : ```cmd java -cp "myapp.jar;libs/*" com.example.MainClass ``` --- #### 步骤4:后台运行(Windows) 使用`javaw`避免命令行窗口阻塞: ```cmd start javaw -jar myapp.jar ``` 创建批处理文件`run.bat`: ```bat @echo off start javaw -jar myapp.jar exit ``` --- #### 常见错误排查 - **错误1**:`ClassNotFoundException` 原因:缺少依赖库。需检查`-cp`参数是否包含所有依赖路径[^2]。 - **错误2**:`Invalid signature file digest` 原因:签名冲突。可通过`zip -d myapp.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*.DSA'`删除签名文件。 --- ### 相关问题 1. **如何为JAR包生成包含依赖的“胖JAR”?** (提示:使用Maven Assembly插件Spring Boot的打包方式) 2. **如何通过命令行编译Java项目并打包为JAR?** (涉及`javac`、`jar -cvf`命令和清单文件配置[^3]) 3. **为什么某些JAR包无法通过`java -jar`运行但IDE可以?** (可能原因:IDE自动处理依赖路径环境变量差异)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值