Java 的 JRE、JDK、卸载 OpenJDK、双击打开 jar、java文档

Java17 官方 API 文档:https://docs.oracle.com/en/java/javase/17/docs/api/index.html

1、JRE、JDK

JRE 和 JDK 区别

  • JRE (Java Runtime Environment):JRE 就是 java 运行时环境,包含了 java 虚拟机,java 基础类库,是 java 程序运行时,所需要的软件环境。如果只需要运行 java 程序,只需安装 JRE 就可以。JRE 根据不同操作系统(如:windows,linux等)和不同 JRE 提供商(IBM、ORACLE等)有很多版本,最常用的是 Oracle 公司收购 SUN 公司的 JRE 版本。
  • JDK (Java Development Kit): JDK 就是 java 开发工具包,是使用 java 语言编写 java 程序所需的开发工具。JDK 包含了 JRE,同时还包含了编译 java 源码的编译器 以及调试和分析的工具,还有所需的文档和 demo 例子程序。如果需要编写 java 程序,需要安装 JDK。

图来源:https://docs.oracle.com/javase/7/docs/

OpenJDK 和 OraleJDK

在大多数 Linux 发行版本里,内置或者通过软件源安装 JDK 的话,都是安装的 OpenJDK。

那么什么是 OpenJDK ?OpenJDK 和 OracleJDK 有啥区别 ?

  • Oracle JDK 由 Oracle 公司开发,该公司是Sun许可证,基于Java标准版规范实现。它以二进制产品的形式发布。它支持多种操作系统,如Windows,Linux,Solaris,MacOS等。它支持不同的平台,如 Intel 32位和64位架构,ARM架构和SPARC。它完全基于Java编程语言。Oracle JDK包含许多组件作为库形式的编程工具集合。
  • OpenJDK 是 Java SE 平台版的开源和免费实现,它是 Sun Corporation( 现在的Oracle Corporation)于2006年开始的开发结果。它是根据GNU GPL许可证授权的。它最初于2007年发布。它由 Oracle Corporation,Red Hat,IBM,Apple Inc.,OpenJDK和Java Community 等开发。它是使用C ++和Java编程语言编写的。它支持不同的操作系统,如FreeBSD,Linux,Microsoft Windows,Mac OS X. OpenJDK是Java SE Platform Edition 的官方参考实现。

OracleJDK 和 OpenJDK 的区别

  • Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次。
  • Oracle JDK 将更多地关注稳定性,它重视更多的企业级用户,而OpenJDK经常发布以支持其他性能,这可能会导致不稳定。
  • Oracle JDK 支持长期发布的更改,而 Open JDK 仅支持计划和完成下一个发行版。
  • Oracle JDK 根据二进制代码许可协议获得许可,而 OpenJDK 根据GPL v2许可获得许可。 使用 Oracle平台时会产生一些许可影响。如 Oracle 宣布的那样,在没有商业许可的情况下,在2019年1月之后发布的 Oracle Java SE 8 的公开更新将无法用于商业,商业或生产用途。但是,OpenJDK 是完全开源的,可以自由使用。
  • Oracle JDK 的构建过程基于OpenJDK,因此OpenJDK与Oracle JDK之间没有技术差异。
  • Oracle JDK 被很多顶级公司使用,例如:Android Studio,Minecraft 和 IntelliJ IDEA 开发工具,其中 Open JDK 不太受欢迎。
  • Oracle JDK 具有 Flight Recorder,Java Mission Control 和 Application Class-Data Sharing功能,Open JDK 具有 Font Renderer 功能,这是 OpenJDK 与Oracle JDK之间的显着差异。
  • Oracle JDK 具有良好的GC选项和更好的渲染器,而OpenJDK具有更少的GC选项,并且由于其包含自己的渲染器的分布,因此具有较慢的图形渲染器选项。
  • 在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能。
  • 与 OpenJDK 相比,Oracle JDK 的开源社区较少,OpenJDK 社区用户的表现优于 Oracle
  • OracleJDK 运行时几乎不会产生任何问题,而 OpenJDK 会产生一些问题。
  • Oracle JDK 从10.0.X版本开始收费,而OpenJDK因为是开源,所以是免费。
  • Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本。
  • Oracle JDK以前是由Sun开发的,后来被Oracle收购并为其他版本维护,而OpenJDK最初只基于Java SDK或JDK版本7。
  • Oracle jdk 部分开源,openJDK 是开放所有源码的。
  • Oracle JDK完全由Oracle公司开发,而 Open JDK 项由IBM,Apple,SAP AG,Redhat等顶级公司加入和合作。

Oracle JDK 与 Open JDK 目录结构比较

不同的命令行操作

大白话认识 JVM

大白话带你认识 JVM:https://javaguide.cn/java/jvm/jvm-intro.html

JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。Java 程序再通过这个虚拟的计算机和真实的物理机交互,间接调用真实系统从而实现各种功能。

Java 文件是如何被运行的。

写一个简单的 HelloWorld.java ,这个 HelloWorld.java 抛开所有东西不谈,其实就是后缀名以java结尾的文本文件,JVM 是不认识文本文件的,所以它需要 编译 成一个二进制文件 HelloWorld.class,Java 文件经过编译后变成 .class 字节码文件,这样 JVM 才能认识。

但是 JVM 想要执行这个 .class 文件,我们需要将其装进一个 类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进 JVM 里面来。

字节码文件通过类加载器被搬运到 JVM 虚拟机中。虚拟机主要的 5 大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行

Oracle GraalVM

什么是 Oracle GraalVM:https://www.oracle.com/cn/java/graalvm/what-is-graalvm/

在讲GraalVM前,先回看下Java当前遇到的问题,概括而言如下:

  1. 云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影
  2. 系统级应用开发的旁观者,Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下
  3. 移动应用、敏捷应用的追随者,移动应用中Android逐步去Java,前端又是JS的世界,敏捷开发方面前有Ruby、Python后有NodeJS

怎么办?要兼容稳定,那么别打语法、API、字节码创新的心思,Java本身就那样了,但它背后的JVM 却有更多的选择。Java 的问题可以让 JVM 来补救,说资源占用高那先来个 JPMS 模块化(但目前看貌似并不成功),说启动延迟大那咱支持AoT搞Native吧,说对系统级应用、移动应用、敏捷应用支持不好那你行你上,我把你们都包进来纳入到我JVM大生态中,这就是GraalVM正在做的。所以 GraalVM 是一个新的 JVM。

官方定义 GraalVM 的定义

Oracle GraalVM 是一个使用即时 (JIT) 编译器加速 Java 和 JVM 应用性能的高性能 JDK。它由 Oracle 提供 24/7 支持,能够降低应用延迟,通过缩短垃圾回收时间提高峰值吞吐量。

此外,GraalVM 本地镜像实用程序可提前 (AOT) 编译 Java 字节码,生成可近乎瞬时启动且仅占用极少内存资源的本机可执行文件。

2、下载 jdk


官网下载地址:https://www.oracle.com/java/technologies/downloads/
Java8下载:https://www.java.com/en/download/
JDK 镜像站点:https://www.injdk.cn/

Java SE、Java EE、Java ME

Oracle 官网有好几个 java 版本,但是最重要的主要有三个:Java SE、Java EE、Java ME

  1. Java SE(Java Platform,Standard Edition)。以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
  2. Java EE(Java Platform,Enterprise Edition)。以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
  3. Java ME(Java Platform,Micro Edition)。以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

三者的区别,简而言之,主要是面向的应用领域不一样

  1. javase:即 J2SE ( java标准版 ),主要做一般的 java 应用,比如:应用软件 / QQ之类的通信软件等
  2. javaee: 即J2EE ( 主要做企业应用 ) ,比如:公司网站、企业解决方案等。
  3. javame: 即J2ME,主要面向嵌入式等设备应用的开发,比如:手机游戏等。

3、Java 环境变量配置

配置Java环境变量:https://www.runoob.com/w3cnote/windows10-java-setup.html

Windows 配置

( java1.5 版本之后可不需要设置 classpath )

windows 设置步骤:此电脑 ---> 属性 ---> 高级系统设置 ---> 环境变量 ---> 系统环境变量

JAVA_HOME    D:\java\jdk1.8.0_171
CLASSPATH    .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
Path    添加      %JAVA_HOME%\bin  和 %CLASSPATH%

Linux 设置

解压:tar -zxvf 文件名

临时设置:export PATH=/usr/local/share/java17/bin:$PATH
当前用户设置,打开~/.bashrc,添加行:export PATH=/usr/local/share/java17/bin:$PATH

所有用户设置(vim /etc/profile):export export PATH=/usr/local/share/java17/bin:$PATH
对于对vi不熟悉的可以使用 gedit 命令启动文本编辑器比起vi命令更方便:sudo gedit /etc/profile

export JAVA_HOME=/opt/java/jdk-10.0.1
export JRE_HOME=/opt/java/jre-10.0.1
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin

设置生效:source profile
验证是否成功。执行命令:java --version 或者 javac --version
如果安装正确,jdk 和 jre 则都是我们自己安装的版本

设置默认 jdk (如果有openjdk时)

由于 Ubuntu 中可能会有默认的 jdk,如 openjdk。如果有 openjdk时。可以设置默认使用的jdk。

sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-10.0.1/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /opt/java/jdk-10.0.1/bin/javac 300  

sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-10.0.1/bin/java 300  
sudo update-alternatives --install /usr/bin/javac javac /opt/java/jdk-10.0.1/bin/javac 300  
sudo update-alternatives --install /usr/bin/jar jar /opt/java/jdk-10.0.1/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /opt/java/jdk-10.0.1/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /opt/java/jdk-10.0.1/bin/javap 300

通过上面步骤将我们安装的 jdk 加入 java 选择单。

然后执行代码:

sudo update-alternatives --config java  
sudo update-alternatives --config javac  

通过这一步选择系统默认的jdk

ubuntu 切换java环境,配置单独的用户环境

执行命令:sudo  update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 auto mode
1 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 manual mode
2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode

选择 1
然后服务器的全局变量java就是变成


java -version
java version "1.7.0_121"
OpenJDK Runtime Environment (IcedTea 2.6.8) (7u121-2.6.8-1ubuntu0.14.04.3)
OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)

Linux 使用 update-alternatives 命令进行版本的切换:https://blog.csdn.net/JasonDing1354/article/details/50470109
ubuntu 利用 update-alternatives 配置 java:https://blog.csdn.net/yinlijun2004/article/details/53008035

卸载 openjdk

执行命令:sudo apt-get remove openjdk*

6、双击 jar 文件直接打开

关于 加壳

  • 1、壳的功能:壳最本质的功能就是实现加载器,壳是指在一个程序的外面再包裹上另外一段代码,保护里面的代码不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务,深入点就是在apk外面再套一层壳,在运行的时候这层壳会把真正的apk的dalvik指令集释放出来,为apk加壳是目前主流的防护方案,真正的源码是隐藏在壳之下的,要想拿到源码研究其逻辑就要先想办法将壳脱掉,所以我们拿到一个apk要逆向的第一步就是用查壳工具看下这个apk文件是否加壳,以及加了什么壳,然后想办法把壳脱掉,拿到dex文件再去分析。注意:壳绝对不能改变原来代码的执行流程;加壳程序也不能对源程序有任何的影响。
  • 2、apk的组成原理:apk壳和pc端的都差不多,只是在处理不同的文件格式dex和exe中会有差别;导致不同的加壳;Android上的应用安装文件是apk格式的,这个apk文件其实就是个归档文件压缩包,把应用相关的源码、资源文件、配置文件等等都归档打包,直接解压之后就能得到app的dalvik指令集dex文件,然后再反编译为smali,还可以再反编译为Java,这样就几乎等同于拿到了app就能拿到可读性还蛮清晰的源码。
  • 3、Android Dex文件加壳原理:Android APK加壳过程中,牵扯到三个角色:加壳程序(加密源程序为解壳数据、组装解壳程序和解壳数据)、解壳程序(解密解壳数据,并运行时通过DexClassLoader动态加载)、(源程序)需要加壳处理的被保护代码

关于壳的资料

Dex文件结构:https://blog.csdn.net/androidsecurity/article/details/8664778
APK加壳原理简述:https://blog.csdn.net/amurocrash/article/details/79103189
Android APK加壳技术方案【1】:https://blog.csdn.net/androidsecurity/article/details/8678399
Android APK加壳技术方案【2】:https://blog.csdn.net/androidsecurity/article/details/8809542
Android4.0内存Dex数据动态加载技术https://blog.csdn.net/androidsecurity/article/details/9674251

APKSCAN-PKID 下载

Windows 版下载地址:https://www.jb51.net/softs/603472.html
Java 版下载地址:https://pan.baidu.com/s/1rDfsEvqQwhUmep1UBLUwSQ    密码: wefd

Windows 解压后双击即可打开,选择apk路径或直接拖放至exe中

Java 版的需要用到Java环境,然后执行:java -jar .\ApkScan-PKID.jar

jar 文件的3种运行方式

.jar 文件的类型为 Executable Jar File (.jar),可以直接双击执行,但是运行.jar需要安装相应的java环境。其实.jar文件可以直接解压缩,里面都是.class文件,但是.class文件不能直接运行。首先弄清楚要运行的 .jar 文件需要哪个版本的JDK,,再去官网下载。JDK包含JRE,JRE又包含JVM

命令行执行

示例:java -jar .\ApkScan-PKID.jar

双击运行.jar

在运行中输入regedit,打开注册表编辑器,菜单栏---> 编辑 ---> 查找 javaw.exe 。

找到以下目录 javaw.exe->shell->open->command,找到后按箭头指示双击修改数据

修改数据为 "C:\Program Files\Java\jdk-15.0.2\bin\javaw.exe" -jar "%1" 然后单击确定,现在就可以双击运行 jar 文件。

bat 文件 运行

修改注册表可能过于麻烦,还不如直接命令行启动jar文件例如:java -jar jar文件路径

但是每次都用命令行和复制文件路径又过于繁琐而且还要考虑绝对路径和相对路径的问题,所以不如直接写一个bat命令程序,在每次双击运行jar文件时用该程序打开,间接的调用命令行,但是节省了敲命令的时间以及避免了路径的错误,一劳永逸。程序代码如下。

javaw -jar %1

再把jar文件的默认打开方式指定为jar.bat就好了。以后jar文件就都可以双击直接运行了。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值