精华内容
下载资源
问答
  • java命令
    千次阅读
    2021-03-06 01:32:17

    java 编译的过程,就是将 java 项目从源文件变成 .class 文件的过程,而 .class 文件,最后会被加载到JVM 中运行。在 JDK bin/ 目录下,提供了 javac 命令,用于将 .java 源文件编译成 .class 字节码文件,提供了 java 命令,以 Main_Class 为入口,根据运行需要,加载相应的 class 文件到 JVM 中执行。

    关于环境变量

    如果在没有引用第三方 jar 的情况下,想在任意目录下直接运行 javac 编译 .java 文件,则需要设置 PATH 和 CLASSPATH 环境变量,关于如何设置,可参考 Ubuntu 下如何设置 Java 环境变量

    两种情况

    如果 java 程序只有单个 .java 文件,且里面有 public static void main(String[] args) 方法,可以直接使用 javac 编译生成 .class 文件 -> 使用 java 命令运行程序

    >$javac Hello.java

    >$java Hello

    如果有多个 .java 文件,则多了一个步骤,需要先打包成 .jar 文件,最后使用 java -jar xx.jar 命令运行即可,总结如下:使用 javac 编译生成 .class 文件 -> 使用 jar 命令生成 jar 包 -> 使用 java 命令运行程序

    jar 命令生成 jar 包

    >$ cd classes // 首先进入根目录,否则打包会有问题

    >$ touch MANIFEST.MF

    >$ jar -cvfm xx.jar MANIFEST.MF com/

    更多相关内容
  • JAVA 命令执行 学习笔记

    千次阅读 2021-12-02 10:45:36
    JAVA 命令执行 学习笔记前言java.lang.Runtime 前言 今天来了解一下Java命令执行,命令执行在安全领域中的应用还是非常广的,得好好理解学习一下 java.lang.Runtime java.lang.Runtime 类的 exec() 方法是Java中最...

    前言

    今天来了解一下Java的命令执行,命令执行在安全领域中的应用还是非常广的,得好好理解学习一下,至于下面用到的一些知识点如果忘记了的话可以去上一篇文章JAVA RMI学习笔记看看,本文依旧是跟着Epicccal师傅来学习总结的

    关于exec

    Runtime类,顾名思义就是运行时环境,Runtime的exec方法是Java中最常见的执行命令的方式 ,现在我们先来分析一下exec的执行过程

    import java.io.IOException;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class lmonstergg {
    
        public static void main(String[] args) throws IOException {
            Process p = Runtime.getRuntime().exec("whoami"); //执行系统命令
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    

    经典命令执行实验代码,我们在exec那里下断点然后步入
    在这里插入图片描述
    这里又返回一个exec方法,进去看看
    在这里插入图片描述
    这里又返回一个exec方法,继续跟进
    在这里插入图片描述
    这里返回一个ProcessBuilder对象,该对象调用了start方法

    ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处理实现进程的控制管理。每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。

    通过代码不难看出 , exec()方法执行命令的原理是通过 ProcessBuilder 对象创建了一个执行命令的子进程

    java.lang.Runtime

    java.lang.Runtime 类的 exec() 方法是Java中最常见的执行命令的方式

    1.获取类

    正常情况下 , 我们想要拿到一个除系统类以外的类 , 必须要先 import 后才能使用 . 否则会出现 cannot find symbol 等报错 . 但是在进行利用时 , 系统是不会让你随意加载类的

    但是 , 通过 Class.forName(className) 获取类则没有这个限制 , 我们可以通过 forName() 方法加载任何类 .

    如下所示
    在这里插入图片描述

    2.获取可调用方法

    拿到了 java.lang.Runtime 类后 , 我们肯定想知道该类可调用的方法 . 于是通过 className.getMethods() , className.getDeclaredMethods() 来获取类的方法
    在这里插入图片描述
    从输出信息中可以找到我们想要执行的 exec() 方法

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    public class test {
    
        public String prt(String name)
        {
            return name;
        }
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
            String name="lmonstergg";
            Class<?> cls=Class.forName("java.lang.Runtime");
            Method[] methods = cls.getMethods();
            Method[] declaredMethods = cls.getDeclaredMethods();
            System.out.println("getMethods获取的方法:");
            for(Method m:methods)
                System.out.println(m);
            //getDeclaredMethods()方法获取的所有方法
            System.out.println("getDeclaredMethods获取的方法:");
            for(Method m:declaredMethods)
                System.out.println(m);
        }
    }
    

    3.调用方法

    拿到了类 , 拿到了类的方法 , 就可以通过反射实例化对象并通过 invoke() 调用方法了
    在这里插入图片描述
    发现程序抛出了异常 , 报错信息为 : Exception in thread “main” java.lang.IllegalAccessException: Class test7 can not access a member of class java.lang.Runtime with modifiers “private”

    简单的翻译一下 , 结果为 : test7 类无法访问 java.lang.Runtime 类中带有 “private” 修饰符的成员变量 / 成员函数 .

    这里就很有意思了 , 在第二步中输出类的方法时 , exec()方法的修饰符全部为 “public” . 那么这个 “private” 修饰符是哪来的呢 ?

    在通过 cls.newInstance() 构造实例对象时 , 会默认调用无参构造函数 . 难道这个无参构造函数是私有的吗 ?

    我们随便找一个Java项目的源代码来看看java.lang.Runtime
    在这里插入图片描述
    可以发现 , java.lang.Runtime 类的构造方法的确使用了 “private” 修饰符 . 我们知道 “private” 修饰符修饰的方法只能在当前类中被调用 , 外部是不可见的 . 那么设计者为什么要这么做呢 ?

    我对 Java 设计模式并不了解 , 因此这里引用 Phith0n师傅 的一段话 , 说的非常形象 .

    这一种比较常见的设计模式 , 被称为 "单例模式 / 工厂模式"
    
    类似一个 Web 应用 , 数据库连接应该只在服务启动时建立一次 , 而不是每次访问数据库时都建立一个连接 .
    
    因此开发人员可以把数据库连接写在构造函数中 , 并赋予该函数 "private" 修饰符 . 然后编写一个静态方法来获取该连接 .
    
    这样 , 只有在类初始化时会调用一次构造函数 , 建立数据库连接 . 后面只需要通过静态方法就能获取数据库连接 , 避免了建立多个数据库链接 .
    

    我们再看代码 , 发现的确存在一个 getRuntime() 的静态方法 , 并且返回了 java.lang.Runtime 的实例对象 .

    在这里插入图片描述
    您可能会疑惑 , 这里的构造方法是 Runtime() , 实例化的过程并没有写在构造函数里啊?

    个人认为这是无关紧要的 , 只需要确保实例化过程只进行一次就行了 , 以 Java 反射为例 , 在类初始化时会执行 static{} 代码块中的内容( 详见本文开头 ) , 所以会执行一遍实例化过程 . 由于该过程被赋予了 “private” 修饰符 , 所以后面就再也不能访问它了 . 结果是一样的 .

    这里也引出了 class.newInstance() 方法执行成功的两个关键点 :

    类必须要有无参构造函数 .
    
    类的构造函数不能是私有的 , 也就是不能通过 "private" 修饰符来修饰构造函数 .
    

    有了这些结论 , 我们就可以通过 Java 反射机制来执行 exec() 方法了 .

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    public class test {
    
        public String prt(String name)
        {
            return name;
        }
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, IOException {
            String name="lmonstergg";
            Class<?> cls=Class.forName("java.lang.Runtime");
            Method mgetruntime=cls.getMethod("getRuntime");
            Method mexec=cls.getMethod("exec",String.class);
            Object obj=mgetruntime.invoke(null);
            Process p=(Process)mexec.invoke(obj,"ipconfig");
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    

    在这里插入图片描述
    命令成功执行了,接下来我们分析下代码

    通过 Method mGetRuntime = cls.getMethod("getRuntime"); 和 Method mExec = cls.getMethod("exec",String.class); 分别获取 getRuntime() 方法和 exec() 方法.
    
    通过 getRuntime() 的 invoke(null) 方法获取 Runtime 实例对象 . 由于调用的是静态方法 , 所以省略 obj 参数 , 由于 getRuntime() 方法没有参数 , 所以这里参数数组为 null .
    
    通过 exec() 的 invoke(obj , args[]) 方法来执行命令 . 这里 obj 是 Runtime 实例对象 , 通过上一步骤获得 , 参数则为系统命令 "ifconfig" .
    
    获取执行结果的字节流 , 将其处理成字符流 , 最后输出字符串 .
    

    一些补充

    关于上面的代码,在读取流的时候,一次读取一个字节并不是最高效的方法。很多流支持一次性读取多个字节到缓冲区,对于文件和网络流来说,利用缓冲区一次性读取多个字节效率往往要高很多。

    关于 Object obj = mGetRuntime.invoke(null); 这个点

    invoke() 的方法参数为什么是一个类( Class ) 呢?

    我们可以通过 对象.方法名 来调用实例方法 , 类名.方法名 来调用静态方法 , 那么反过来 , 方法名.invoke(对象) 不就可以映射成 方法名.invoke(类)
    在这里插入图片描述

    java.lang.ProcessBuilder

    通过上面的内容我们知道了Runtime的exec方法执行命令,实际上是调用了ProcessBuilder的start方法创建了一个进程执行了命令,既然如此我们可以考虑直接通过 ProcessBuilder 类来执行命令

    那我们先看看ProcessBuilder 类的构造函数
    在这里插入图片描述
    可以看到 , ProcessBuilder 类有两个构造函数 , 这两个函数定义都非常简单,一个用于执行没有参数的命令 , 一个用于执行携带参数的命令,需要注意 : command 参数的类型是 List

    所以 , 我们接下来调用 java.lang.ProcessBuilder.start() 方法 , 创建子进程来执行命令

    执行不带参数的系统命令

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Arrays;
    import java.util.List;
    
    public class test {
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, IOException {
            String name="lmonstergg";
            Class<?> cls=Class.forName("java.lang.ProcessBuilder");
            //上面这段获取类
            Object obj=cls.getConstructor(List.class).newInstance(Arrays.asList("ipconfig"));
            //上面这段用className.getConstructor( parameterType ).newInstance( parameterName )模式构造对象,该对象的参数为ipconfig,Arrays.asList用于转换使其类型为List
            Method mstart=cls.getMethod("start");
            //上面这段获取start方法
            Process p=(Process)mstart.invoke(obj);
            //调用该方法
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    

    在这里插入图片描述

    通过 className.getConstructor( parameterType ).newInstance( parameterName ) 来调用含有参数parameter的构造函数
    
    由于 cmdarray 参数的类型是 List , 所以我们执行的命令的类型也必须是 List , 此时可以用 Arrays.asList() 方法将一个可变长参数或者数组转换成 List 类型 .
    
    由于 start() 方法没有参数 , 所以直接调用 Method.invoke(obj) 就可以了
    

    执行携带参数的系统命令

    有两种方法来执行携带参数的系统命令,其实就是怎么用ProcessBuilder的两种构造函数来分别执行系统命令,下面分别来说一下

    1.public ProcessBuilder(List command)

    这里还是通过 Arrays.asList() 方法 . 由于该方法的参数可以是一个可变长参数 , 所以我们可以直接把携带参数的系统命令写到一个数组中 , 然后通过该方法转换成列表 .

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Arrays;
    import java.util.List;
    
    public class test {
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, IOException {
            String name="lmonstergg";
            Class<?> cls=Class.forName("java.lang.ProcessBuilder");
            //上面这段获取类
            Object obj=cls.getConstructor(List.class).newInstance(Arrays.asList("netstat","-r"));
            //上面这段用className.getConstructor( parameterType ).newInstance( parameterName )模式构造对象,该对象的参数为ipconfig,Arrays.asList用于转换使其类型为List
            Method mstart=cls.getMethod("start");
            //上面这段获取start方法
            Process p=(Process)mstart.invoke(obj);
            //调用该方法
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    

    在这里插入图片描述

    2.public ProcessBuilder(String… command)

    这是上文所说的 ProcessBuilder 类的第二个构造函数 , 也就是专门用于执行携带参数的系统命令的构造函数 .
    在这里插入图片描述
    可以看到 , 该构造方法的参数是也是一个可变长参数 . 可变长参数代表着不定长度的参数 ,表示该形参可以接受多个参数值,多个参数值被当成数组传入,所以

    public void test(String[] names)
    等价于
    public void test(String ... names)
    

    有关可变参数的具体内容可看这里

    因此,我们可以将 String[].class 作为参数传递给 getConstructor() 方法 , 告诉 ProcessBuilder 调用第二个构造方法来处理携带参数的系统命令 .

    Phith0n 师傅 的文档里是这么写的 .
    在这里插入图片描述
    但是这么写并不能编译成功 . Javac会抛出异常!

    Warning: non-varargs call of varargs method with inexact argument type for last parameter
    
    警告: 最后一个参数使用了不精确的变量类型的 varargs 方法的非 varargs 调用
    

    其中 varargs 代表可变参数 , 那么这个报错是什么意思呢 ?

    在 Windows 下的 Javac 给出了提示 : 对于 varargs 调用 , 应使用 Object
    在这里插入图片描述
    于是我们按照这个方法来写

    // 定义一个一维数组实例 , 其中包含了要执行的命令.-
    String[] command = new String[]{"uname","-a"};
    // 创建一个 Object 数组 , 将上一步创建的数组实例的引用赋值给这个 Object 数组
    Object cmds[] = new Object[]{command};
    

    如果对上面这种写法有疑问 , 可以参考 Java Object数组引用讨论 一文 . 将上面两步合并在一起 , 就变成了下面这一行代码.

    // 这里尝试执行 uname 命令 , 携带参数 -a
    Object obj = new Object[]{new String[]{"uname","-a"}}
    

    最终修改后的代码如下所示 :

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Arrays;
    import java.util.List;
    
    public class test {
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, IOException {
            Object cmd[]=new Object[]{new String[]{"netstat","-r"}};
            //Object cmd[]=new Object[]{}来承接对象
            Class<?> cls=Class.forName("java.lang.ProcessBuilder");
            //上面这段获取类
            Object obj=cls.getConstructor(String[].class).newInstance(cmd);
            //上面这段用className.getConstructor( parameterType ).newInstance( parameterName )模式构造对象
            Method mstart=cls.getMethod("start");
    
            //上面这段获取start方法
            Process p=(Process)mstart.invoke(obj);
            //调用该方法
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    


    系统命令成功执行

    如何调用类的私有方法

    在讲通过 java.lang.Runtime 执行系统命令时 , 由于该类的构造方法 Runtime() 是一个私有方法 , 所以我们不能调用该方法 , 只能通过 getRuntime() 静态方法来返回一个 Runtime 实例对象 , 然后再调用 exec() 方法 . 为此还提到了 " 单例模式 " 这种设计模式 .

    也就是说 , 我们无法直接获取到私有构造方法的 . 那么是否有其他方法来获取私有构造方法呢 ?

    java.lang.reflect.AccessibleObject.class 中存在这么一个方法 : setAccessible(boolean flag)

    来看下官方文档中是怎么定义这个方法的 .
    在这里插入图片描述
    从中我们可以知道 , 当该方法的参数被设置为 True 时 , 会取消 Java 语言访问检查 , 也就是取消对 public , protected , private 等修饰符的检查 .

    但是 , 如果对象是 java.lang.Class.Constructor , 那么将会抛出异常 . 也就是说 , 我们不能通过 getConstructor() 方法来获取构造方法

    这时我们可以使用 getDeclaredConstructor() 方法 ,该方法与 getConstructor() 方法最大的不同点在于 : 这个方法会返回指定参数类型的所有构造方法 . 包括 public , protected 以及 private 修饰符修饰的 .
    
    而 getConstructor() 方法只会返回所有构造方法的一个子集 , 即 public 修饰符修饰的 .
    

    因此 , 通过 getDeclaredConstructor() 方法 , 我们可以获取到私有构造方法 Runtime() . 并且 , 通过setAccessible(boolean flag)关闭 Java 语言访问检查时也不会再抛出异常 .

    代码如下

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    
    public class test {
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, IOException {
    
            Class<?> cls=Class.forName("java.lang.Runtime");
            //上面这段获取类
            Method mexec=cls.getMethod("exec",String.class);
            Constructor<?> cst=cls.getDeclaredConstructor();
            cst.setAccessible(true);
            Object obj=cst.newInstance();
    
            //上面这段获取start方法
            Process p=(Process)mexec.invoke(obj,"netstat");
            //调用该方法
            InputStream is=p.getInputStream();  //获取进程p的标准输出流作为输入字节流
            InputStreamReader isr=new InputStreamReader(is);  //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);  //为字符流提供缓冲区,便于读取整块数据
            String line=null;
            while((line=br.readLine())!=null)
            {
                System.out.println(line);
            }
        }
    }
    

    通过 getDelclaredConstructor() 方法获取到 Runtime() 构造方法 , 关闭 Java 语言访问检查 , 然后构建实例对象 . 最后通过 Method.invoke(obj , parameter) 调用 exec() 方法 。

    通过这种方法 , 就可以直接访问任意类的私有构造方法了.
    在这里插入图片描述

    关于Runtime.getRuntime().exec某些时候会失效这个问题

    这个问题大家可以看下这篇文章,本文就不重复分析了。

    参考文章

    展开全文
  • java-用cmd运行java命令

    千次阅读 2021-06-19 07:56:22
    在用cmd运行java开发工具之前,我们要先完成环境变量的设置,设置环境变量的目的是为了在整个系统的任何路径下都可以使用java工具来运行程序。 1.环境变量设置

           在用cmd运行java命令之前,我们要先完成环境变量的设置,设置环境变量的目的是为了在整个系统的任何路径下都可以使用java命令来运行程序。

    1.环境变量设置

         在windows中依次打开控制面板-->系统与安全-->系统-->高级系统设置-->环境变量-->系统变量,点击系统变量中的新建就可以设置环境变量了。 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME、CLASSPATH、PATH。各自的设置的方式如下所示:

    JAVA_HOMEC:\Program Files\Java\jdk1.8.0_291(jdk的安装路径)
    CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
    PATH%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

         其中%JAVA_HOME%==C:\Program Files\Java\jdk1.8.0_291,设置完环境变量后,就可以在任意路径中使用java命令。

    2.部分java命令

    命令使用方法作用
    javacjavac  User.java将.java文件编译生成字节码.class文件
    javajava   User执行生成字节码文件后的运行结果
    javapjavap [ 命令选项 ]  User.class反编译工具,将字节码解析成代码
    javadocjavadoc User.java生成文档注释
    jarjar [ 命令选项 ]  User.class打包

    3.示例

    1.在桌面上建一个名为com的文件夹,在文件夹中用记事本写两个类文件,后缀改为.java。两个类文件的内容如下图所示:

    2.使用javac命令编译主函数,命令行为javac  TestMain.java。结果可以看到自动生成了两个.class文件。

    3.使用java TestMain命令行运行程序得到运行结果如下:

    4.命令行javadoc Test.java会发现在文件夹中多了很多内容,这些就是文档注释。

    5.javap [ 命令选项 ]  Test.java的一些功能如下:

     

     

     

    展开全文
  • cmd中执行java命令没有输出结果

    千次阅读 2021-03-16 11:00:38
    该楼层疑似违规已被系统折叠隐藏此楼查看此楼一开始都是好好的,执行java,javac之类的命令都有正确输出结果,然后我想学习bat脚本,把系统变量JAVA_HOME删除,然后执行了以下vat脚本::@的作用是不输出echo xxx这句...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    一开始都是好好的,执行java,javac之类的命令都有正确输出结果,然后我想学习bat脚本,把系统变量JAVA_HOME删除,然后执行了以下vat脚本

    ::@的作用是不输出echo xxx这句话,@echo off的作用是不输出当前的命令及路径

    @echo off

    ::获取管理员权限,复制即可用

    %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

    ::所有的系统变量都在这里

    ::set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

    set java_home_path=D:\Java\jdk1.8.0_192

    set mongodb_home_path=D:\mongodb

    ::判断该系统变量是否存在

    if "%JAVA_HOME%"=="" (

    setx /m JAVA_HOME "%java_home_path%"

    echo set JAVA_HOME system variable

    ) else (

    echo JAVA_HOME exist

    )

    if "%MONGODB_HOME%"=="" (

    setx /m MONGODB_HOME "%mongodb_home_path%"

    echo set MONGODB_HOME system variable

    ) else (

    echo MONGODB_HOME exist

    )

    pause

    执行完毕后,也可以找到JAVA_HOME变量,可是执行java命令后,完全没有输出,不提示错误,就是两行空的

    C:\Windows\System32>java

    PATH路径没动

    然后就没了,就这样,执行javadoc则返回乱码,之前都是好好的,cmd也是utf-8

    求教

    展开全文
  • 命令行,powershell,使用javajava 命令,直接调用执行class文件 https://blog.csdn.net/sxzlc/article/details/73744721 1.直接调用java文件■cmd set path=%path%;C:\Program Files (x86)\Java\jre1.8.0_131...
  • 使用java命令执行函数反弹windows-shell

    千次阅读 2022-04-16 22:37:09
    偶尔有时命令执行有效负载Runtime.getRuntime().exec()会失败。使用Webshell,反序列化漏洞或其他向量时可能会发生这种情况。 这是因为重定向和管道字符的使用方式在正在启动的进程的上下文中没有意义。 所以不像在...
  • java命令-指定端口启动

    千次阅读 2020-11-23 08:09:05
    指定端口启动: java -jar xx.jar --server.port=8085
  • linux启动java命令

    千次阅读 2020-04-17 09:39:21
    一、启动jar包命令 nohup java -jar -Xms128M -Xmx1024M -server.port=9002 XX.jar > XX.out 2>&1 & nohup:nohup的意思是忽略SIGHUP信号,关闭shell后,进程还是存在的。 java:启动程序 -jar:启动...
  • 如果遇到了javac命令不可用的情况,那是因为环境变量没有配置成功的原因,跟着博客配置即可 jdk安装好了之后,主要配置三个变量,这里以windows为例 第一个是JAVA_HOME 进到这个对话框后,输入如下 JAVA_HOME...
  • java命令执行的三种方式

    千次阅读 2020-03-12 16:21:01
    本篇文章总结一下java命令执行的三种方式,并且测试了在win环境一次方法调用中可同时执行多个命令的方式。 1 java.lang.Runtime public class RuntimeTest { public static void test1() throws IOException{ ...
  • java -jar MyJar.jar arg0 arg1 通过 -jar 参数可以直接运行,需要打 jar 包时,在 META-INF/MANIFEST.MF 文件里指定 Main-Class。关于这种打包操作参考 Maven 生成(打包)带有依赖的可以直接执行的一个 jar 包。 ...
  • 关于一些java命令作用

    千次阅读 2019-11-18 17:34:15
    java.exe命令的作用是:启动虚拟机,执行字节码。 appletviewel.exe(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器; javadoc.exe:根据Java源代码及其说明语句生成的HTML文档; jdb.exe:Java调试...
  • java命令编译执行,maven打包执行

    千次阅读 2019-04-26 02:14:04
    文章目录java命令编译执行,maven打包执行1.1java命令编译执行,不带包名1.2java命令编译执行,带包名,1.3java命令编译执行,依赖外部jar包1.4maven打包执行,idea打包成可执行的jar1.5java命令(jvm)启动参数1.6...
  • 使用java命令运行class

    万次阅读 2018-03-15 15:32:31
    使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示:用eclipse或用ant则没有...
  • 类名为 HelloWorld.java java HelloWorld (注意,不需要 java HelloWorld.class) 2.当有包时 类名为 com.sxz.HelloWorld.java 结构为 myClass └com └sxz └HelloWorld.class 在myC...
  • linux下java命令不起作用

    千次阅读 2019-01-06 23:31:53
    用javac编译出.class文件了,但是用java命令执行的时候出现错误: 找不到或无法加载主类 H。  这是为什么呢? 很大可能是你classpath配置错误,所以找不到.class文件 原先的/etc/profile配置是: export ...
  • java命令报错——找不到或无法加载主类

    千次阅读 多人点赞 2022-02-23 12:50:54
    java命令报错——找不到或无法加载主类
  • 问题描述: 解压jdk8的安装包, 配置好环境变量后执行java命令报错: exec format error: java 原因: 下载压缩包时没细看, 结果下载错了, 下载的是ARM架构的, 我用的ubuntu/linux是x64架构的 下载正确的压缩包, 重新...
  • 使用java命令执行class文件

    万次阅读 2019-01-08 11:42:55
    使用java命令执行class文件
  • java命令, 指定jdk启动方法

    千次阅读 2019-01-03 14:35:40
    以脚本方式 #!/bin/bash JAVA_HOME=/export/jdk1.8.0_92 ...nohup $JAVA -jar demo-0.1.0.jar -Djava.ext.dirs=$JAVA_HOME/lib &amp; 以tomcat方式 修改startup.bat或者startup.sh文件,增加以下内容: ...
  • cmd中,执行java命令与javac命令的区别: javac:是编译命令,将java源文件编译成.class字节码文件。 例如:javac hello.java 将生成hello.class文件 java:是运行字节码文件;由java虚拟机对字节码进行...
  • Path路径中建议不要使用JAVA_HOME ClassPath路径中可以使用JAVA_HOME
  • 使用java命令出现Error: A JNI error has occurred, please check your installation and try again的错误运行javac HelloWorld.java正常,当是运行java HelloWord报以下错误; 运行javac HelloWorld.java正常,当是...
  • 在最近学习Maven的过程中,对java是怎么编译和寻找对应的类加载做了一下实验。1、实验环境:用idea呈现结构,doc做为编译和运行...2、javac:javac命令编译.java源文件的时候,它会去寻找相关的import的类,如Mai...
  • 现在程序员开发项目都在...2、javac.exe:编译的Java程序,生成.class文件3、javaw.exe:可以运行.class文件,主要用来执行图形界面的java程序运行java命令时,会出现并保持一个console窗口,程序中的信息可以通过Syste...
  • Java命令注入之防护

    千次阅读 2017-11-21 22:27:20
    1 Java中的命令注入 在Java中的Runtime.getRuntime本质就是使用ProcessBuilder,以ProcessBuilder里用ProcessImpl,start 的一个子进程执行命令, Java的native调用 a. Windows是CreateProcessW 创建子进程...
  • java基本命令

    千次阅读 2021-12-29 16:59:53
    dos窗口直接输入javac可以看到大量提示信息,提示javac命令的用法。 package a.b.c; public class SqlGenerator { public static void main(String[] args) { System.out.println("hello world"); } } ...
  • 有时候想看一下jvm环境的user.home、file.encoding等参数,可以通过下面的命令查看:java -XshowSettings:all -version
  • 小伙伴们大家好,今天来给大家讲一讲Java的编译命令,大家都知道在工具上写程序,不知道大家知不知道,在电脑里,Java是以一种什么样的形式存在呢,又是以什么编译命令开始的呢?今天就给大家讲一讲。1.首先搭建好最...
  • wsdl2java命令及参数

    千次阅读 2016-10-02 15:02:59
    wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。  命令行格式为:WSDL2Java [options] -uri : A url or path to a WSDL  WSDL2Java -uri QueryChargeResult.wsdl -p ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,429,658
精华内容 571,863
关键字:

java命令