错误: 找不到或无法加载主类 回归java运行的本质

错误: 找不到或无法加载主类 回归java运行的本质

一,背景

当有了idea这种工具后,java的mian方法执行起来是如此简单,很少有人再手动编辑并通过命令行执行了。

同时,在当今Spring Boot盛行的今天,恐怕很少再有人执行javac和java命令了,现在的java程序包一般都是jar包,运行起来更是简单:

shell 复制代码
java -jar  *.jar

在这种背景下,请问您,您还记得怎么运行*.java文件么?是不是一脸懵逼了??哈哈

不会就对了,我也忘了。

二,怎么样才能在任意目录下编译并执行java文件?

当我们随便写了一个java文件,代码如下。

java 复制代码
package com.lyq.yml;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class Update {

    public static void main(String[] args) throws IOException {
        if (args.length == 0 || args[0] == null || args[1] == null) {
            System.out.println("Please insert srcPath and dstPath");
            String os = System.getProperty("os.name");
            System.out.println("System Property is " + os);
            return;
        }
        String srcFile = args[0];
        String dstFile = args[1];

        System.out.println(srcFile);
        System.out.println(dstFile);
        //set font
        DumperOptions dumperOptions = new DumperOptions();
        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        //read yaml file
        Yaml yaml = new Yaml(dumperOptions);
        InputStream stream = Files.newInputStream(Paths.get(dstFile));
        Map rootMap = (Map)yaml.load(stream);
        //read  add properties file
        Properties properties = new Properties();
        InputStream resourceAsStream = Files.newInputStream(Paths.get(srcFile));;
        properties.load(resourceAsStream);
        //update add value
        for (Object o : properties.keySet()) {
            String key = o.toString();
            String value = properties.getProperty(key);
            setValue(rootMap,key,value);
        }
        //save file
        FileWriter writer = new FileWriter(dstFile);
        yaml.dump(rootMap,writer);
    }

    public static void setValue(Map dstLoad, String key, String value){
        String[] arrayPath = key.split("\\.");
        int len = arrayPath.length;
        Map<String, Object> map = (Map<String, Object>)dstLoad.get(arrayPath[0]);
        if(map == null){
            map = new HashMap<>();
            dstLoad.put(arrayPath[0],map);
        }
        for (int i = 1; i < len-1 ; i++){
            Map tmpMap = map;
            map = (Map<String, Object>)tmpMap.get(arrayPath[i]);
            if(map == null){
                map = new HashMap<>();
                tmpMap.put(arrayPath[i],map);
            }
        }
        System.out.println(",,,,,key:"+key+",,,,value:"+value);
        map.put(arrayPath[len-1],value);
    }
}

该文件的package为com.lyq.yml。它具备配置升级的功能,可以把增量和修改配置去添加到配置文件中,首先它依赖了snakeyaml-1.30.jar。当我们拿到这个java文件放到随意一个目录中,并把snakeyaml-1.30.jar放在该目录下的lib目录下。我们执行如下命令生成.class文件。

shell 复制代码
javac -cp ./lib/snakeyaml-1.30.jar -d . Update.java 

其中可以看到有个-d . 这表明在当前目录下编译。

当编译成功后,

我们可以执行如下命令:

shell 复制代码
java -cp "./lib/snakeyaml-1.30.jar:./" com.xdja.yml.Update  "./incre.properties" "/dstPath/application.yml"

这样我们就可以正常运行这个class了。

三,怎么执行普通的jar包呢?

目前,很多jar都是Spring Boot通过maven打出来的。这种jar包直接通过java -jar 就可以执行。但是,是不是有没有集成Spring Boot的这种普通jar,里面有个Main方法,我们该如何执行呢?

如上图 ,这就是一个普通的maven项目,main方法在GbsClientTest中,可以打jar包,但是不能通过java -jar直接运行。如果我们想手动运行这种项目该怎么做呢?

首先,我们执行如下命令,该命令会把我们所依赖jar包都给导出来。

shell 复制代码
 mvn dependency:copy-dependencies -DoutputDirectory=target/dependency

接下来,我们随便找一个目录a,在里面新建一个lib目录,把所有依赖jar放进去。

然后,我们通过 mvn clean install 打jar包,并把这个jar包放在这个目录a中,执行如下命令就可以运行了。

shell 复制代码
java -cp "lib/*:GbsTest.jar" com.genersoft.iot.vmp.test.GbsClientTest

四,您学会了吗?

常回头看看,差点忘了来时的路。

对了还有一点,当java 中的-cp 在win环境需要多个路径用;号,linux下用:号

相关推荐
张先shen10 分钟前
Elasticsearch RESTful API入门:全文搜索实战(Java版)
java·大数据·elasticsearch·搜索引擎·全文检索·restful
天河归来1 小时前
springboot框架redis开启管道批量写入数据
java·spring boot·redis
张先shen1 小时前
Elasticsearch RESTful API入门:全文搜索实战
java·大数据·elasticsearch·搜索引擎·全文检索·restful
codervibe1 小时前
如何用 Spring Security 构建无状态权限控制系统(含角色菜单控制)
java·后端
codervibe1 小时前
项目中如何用策略模式实现多角色登录解耦?(附实战代码)
java·后端
TCChzp1 小时前
synchronized全链路解析:从字节码到JVM内核的锁实现与升级策略
java·jvm
大葱白菜1 小时前
🧩 Java 枚举详解:从基础到实战,掌握类型安全与优雅设计
java·程序员
笑衬人心。1 小时前
在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
java·macos·intellij-idea
SimonKing1 小时前
颠覆传统IO:零拷贝技术如何重塑Java高性能编程?
java·后端·程序员
sniper_fandc2 小时前
SpringBoot系列—MyBatis(xml使用)
java·spring boot·mybatis