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

news2024/11/18 20:36:20

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

一,背景

当有了idea这种工具后,java的mian方法执行起来是如此简单,很少有人再手动编辑并通过命令行执行了。
同时,在当今Spring Boot盛行的今天,恐怕很少再有人执行javac和java命令了,现在的java程序包一般都是jar包,运行起来更是简单:

java -jar  *.jar

在这种背景下,请问您,您还记得怎么运行*.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文件。

javac -cp ./lib/snakeyaml-1.30.jar -d . Update.java 

其中可以看到有个-d . 这表明在当前目录下编译。
当编译成功后,
我们可以执行如下命令:

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包都给导出来。

 mvn dependency:copy-dependencies -DoutputDirectory=target/dependency

接下来,我们随便找一个目录a,新建一个lib目录,把所有依赖jar放进去。
然后,我们通过 mvn clean install 打jar包,并把这个jar包放在这个目录a,执行如下命令就可以运行。

java -cp "lib/*:GbsTest.jar" com.genersoft.iot.vmp.test.GbsClientTest

四,您学会了吗?

常回头看看,差点忘了java原来运行的方式了。
对了还有一点,当java 中的-cp 在win环境需要多个路径用;号,linux下用:号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的模具制造企业订单跟踪管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

阿里云国际服务器如何申请退款

如果您的服务器配置购买错了&#xff0c;可以通过工单方式申请退款如何发工单&#xff1f; 打开如下链接登录阿里云国际多云管理服务商_Cloud MSP_九河云 (9he.com) 选择一个类目&#xff0c;提交工单&#xff0c;编辑需求内容 退款之前一定记录好当前剩余余额&#xff0c;避免…

【LeetCode:150. 逆波兰表达式求值 | 栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【驱动开发】注册字符设备使用gpio设备树节点控制led三盏灯的亮灭

注册字符设备使用gpio设备树节点控制led三盏灯的亮灭 设备树&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int OD…

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

力扣刷题-队列-滑动窗口最大值

239. 滑动窗口最大值 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 在线性时间复杂度内解决此题&#xff1f; …

【网络协议】聊聊http协议

当我们输入www.baidu.com的时候&#xff0c;其实是先将baidu.com的域名进行DNS解析&#xff0c;转换成对应的ip地址&#xff0c;然后开始进行基于TCP构建三次握手的连接&#xff0c;目前使用的是1.1 默认是开启了keep-Alive。可以在多次请求中进行连接复用。 HTTP 请求的构建…

【C++的OpenCV】第十四课-OpenCV基础强化(三):单通道Mat元素的访问之data和step属性

&#x1f389;&#x1f389;&#x1f389; 欢迎来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎来到小白piao的学习空间&#xff01;} 欢迎来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496; C\Python所有的入门技术皆在 我…

JS--获取元素的高度与宽度

原文网址&#xff1a;JS--获取元素的高度与宽度_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用JavaScript获取HTML标签的高度与宽度。 读取的方法 document.getElementById("id").clientHeight 元素的尺寸属性 元素尺寸属性 说明 clientWidth 获取…

CentOS7非lvm给根分区扩容

首先查看现有磁盘信息和文件系统的信息 关闭虚拟机&#xff0c;右键虚拟机&#xff0c;点击设置&#xff0c;选中硬盘&#xff0c;右边点击拓展&#xff0c;然后给磁盘空间增加到指定的大小 打开虚拟机&#xff0c;查看扩容后的分区大小&#xff0c;此时会发现根分区大小并…

threejs(10)-WEBGL与GPU渲染原理(难点)后期再消化亦可

一、渲染管线 WebGL 是什么 WebGL (Web图形库)是一个JavaScript API,可在任何兼容的Web浏览器中渲染高性能的交互式3D和2D图形,而无需使用插件。WebGL通过引入一个与OpenGL ES 2.0非常一致的API来做到这一点,该API可以在HTML5 元素中使用。这种一致性使API可以利用用户设备提…

Airtest 如何测试手机 APP?

引言 Airtest 是网易出品的一款基于图像识别的自动化测试工具&#xff0c;主要应用在手机 APP 和游戏的测试。一旦使用了这个工具进行 APP 的自动化&#xff0c;你就会发现自动化测试原来是如此简单&#xff01;&#xff01; 如果对软件测试、接口、自动化、性能测试、测试开…

Git 入门指南:从新手到高手的完全指南

Git是一种强大的分布式版本控制系统&#xff0c;广泛应用于软件开发中。它的使用不仅可以帮助开发团队更好地管理代码&#xff0c;还可以提高团队协作效率和代码质量。随着软件开发的不断发展&#xff0c;版本控制成为了程序员必备的一项技能。 Git的基本概念 Git的基本概念对…

阿里云服务器双11特惠99元一年云服务器ECS经济型e实例

2023阿里云服务器双11优惠价格99元一年经济型e实例&#xff0c;并且续费不涨价&#xff0c;云服务器ECS-经济型e实例2核2G配置、3M带宽、40G ESSD entry系统盘优惠价99元一年&#xff0c;原价956.64元/年&#xff0c;可用于中小型网站建设、开发测试、小程序或app搭建&#xff…

十九、类型信息(4)

本章概要 注册工厂类的等价比较反射&#xff1a;运行时类信息 类方法提取器 注册工厂 从 Pet 层次结构生成对象的问题是&#xff0c;每当向层次结构中添加一种新类型的 Pet 时&#xff0c;必须记住将其添加到 LiteralPetCreator.java 的条目中。在一个定期添加更多类的系统…

锁表后引发的几种删除方式与不同的扩展

在开发过程可能会遇到一些特殊场景&#xff0c;诸如我想删除某表&#xff0c;但是无法删除&#xff0c;去找原因发现是发生了锁表&#xff0c; 锁表指的是在执行一个事务时&#xff0c;该事务获取了一个锁并保持其锁定状态&#xff0c;直到事务完成或手动释放锁&#xff0c;导…

【零参考GAN:Pansharpening】

ZeRGAN: Zero-Reference GAN for Fusion of Multispectral and Panchromatic Images &#xff08;用于多光谱和全色图像融合的零参考GAN&#xff09; 本文提出了一种融合低空间分辨率多光谱(LR MS)和高空间分辨率全色(PAN)图像的新的全色锐化方法–零参考生成对抗网络(ZeRGAN…

深度学习之基于ResNet18的神经网络水果分类系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、神经网络水果分类系统四. 总结 一项目简介 基于ResNet18神经网络的水果分类系统是一个利用深度学习技术进行水果图像分类的系统。下面是该系统…

WOS与CNKI数据库的citespace分析教程及常见问题解决

本教程为面向新手的基于citespace的数据可视化教程&#xff0c;旨在帮助大家更快了解行业前沿的研究内容。 获取最新版本的citespace软件 在citespace官网下载最新的版本&#xff08;如果是老版本&#xff0c;可能会提示让你去官网更新为最新版&#xff0c;老版本不再提供服务…

【Linux】开发工具——vim多模式编辑器的入土设置sudoers白名单

个人主页点击直达&#xff1a;小白不是程序媛 Linux系列专栏&#xff1a;Linux被操作记 目录 前言&#xff1a; 基本概念 vim基本操作 [正常模式]切换至[插入模式] [插入模式]切换至[正常模式] [正常模式]切换至[末行模式] 三种模式的切换关系图 vim命令模式命令集 进…