没了IDE,你的Java项目还能Run起来吗~

计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接->机器码过程。一个语言处理系统的示意图如下:

编译器 是将源语言程序一次性翻译成一个等价的,用目标语言编写的程序。还存在另一种常见的语言处理器,解释器:它是逐个语句的执行源语言程序。由一个编译器产生的目标语言程序通常比一个解释器快,但解释器的错误诊断效果通常更好。
Java语言处理器结合了编译和解释的过程。一个.Java源程序首先被编译为.class字节码文件,被加载到虚拟机中,然后由虚拟机将字节码翻译成机器码。

虚拟机的好处在于:一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。实现一次编写,到处运行。另外一个好处是它带来了一个托管环境。这个托管环境能够代替我们处理一些代码中冗长而且容易出错的部分,如自动内存管理与垃圾回收。
在Hotspot中,虚拟机翻译字节码有两种方式:
1.解释执行
即逐条将字节码翻译成机器码并执行。
2.即时编译
即将一个方法中包含的所有字节码编译成机器码后再执行。
前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
即时编译建立在程序符合二八定律的假设上,也就是百分之二十的代码占据了百分之八十的计算资源。
好了,装X结束。

阿姨知道的编译知识全在上面了。。(っ╥╯﹏╰╥c)
如题,下面我们来看一下让Java项目运行起来我们能做什么。
我们能做的很简单,当然不是写虚拟机。我们只需要:
1.执行command javac,将.Java文件变为.class文件。
2.执行command java,让.class文件运行起来。
也就是 执行command :)
Java程序的运行方式
Java程序可以通过java命令运行.class文件或运行可执行Jar文件。
我们先看第一种方式:从Hello World开始。
运行.class文件
Step1:编写Java文件

Step2:执行 command javac
将.Java文件变为.class文件

小贴士:class文件的全路径名是包名目录+ 类文件名。
Step3:执行 command java
运行.class文件

神奇,我们没有用IDE让Java程序运行起来了 :)
小伙伴先别喷老阿姨,哪特么有这么简单的Java项目啊。。我们工作中用的明明都是Jar文件啊...
Jar文件咋运行啊!!

运行可执行Jar文件
Jar文件是基于ZIP文件格式的一种文件格式,它将大量的Java类文件、相关的元数据和资源(文本、图片等)文件聚合到一个Jar文件中,此外还包含一个可选的META-INF文件夹。这个文件夹下的文件或文件夹主要用来打包和扩展配置信息,包括安全,版本,扩展程序和服务等。如MANIFEST.MF文件定义了扩展和打包的相关数据信息。
一个Jar文件通常在项目中用作第三方类库使用,也是项目构建的一部分。
生成一个Jar文件大致分为两步:
1.将源文件编译为.class文件
2.通过 command jar命令将.class文件,资源文件等等打成一个文件格式的Jar文件。
我们以一个SbDemo项目为例来看Jar文件的打包和运行。项目目录结构如下:

Test2.java中调用了Test1.java的方法,

我们需要先将Test1.java编译并打成一个Test1.jar文件,然后通过Test1.jar将Test2.java编译并打成一个可执行的Test2.jar文件。
可执行和不可执行的Jar文件 区别在于是否在Jar文件中指定了main方法的入口,我们后面再看。
Step1:Test1.java的编译

Step2:将编译后的classes/com/Test1.class文件打成一个Test1.jar包
Java中和jar包相关的命令是jar命令,生成一个jar包我们需要定义信息文件(manifest-file),它可以定义所生成jar包的classpath类搜索路径,jar包的入口类等等。可以理解为与Jar包相关的元数据配置信息。
Step2.1 书写信息文件
这里我们使用resources/manifest-test1.text文件作为信息文件

是的,Test1.java太简单了,就是打成一个可被他人引用的jar包,信息文件不重要。
Step2.2 执行打包命令

Step3. 编译Test2.java文件
因为Test2.java中引用了com.Test1类,所以我们需要在编译时指定Classpath路径。
Classpath:顾名思义,是指待编译类依赖的类所在路径位置。我们可以通过 javac 的 -cp 参数指定。
关于编译时classpath的值优先级如下:
- 如果没有传入classpath参数,将使用环境变量CLASSPATH的值。(小伙伴不知道环境变量咋查看和设置?去看阿姨的上一篇文章:)
- 如果没有发现环境变量CLASSPATH,将使用 执行命令的当前文件夹(.)。
- 如果javac命令行 通过
-classpath or -cp参数指定了类路径值,则优先级最高。
这里我们使用-cp指定Test1.jar所在位置

可以看到classes目录下已经生成了com2/Test2.class文件了。
Step4. 将编译后的Test2.class和它依赖的Test1.jar一起打成一个可执行的Jar包
Step4.1 书写信息文件
这时候我们使用信息文件resources/manifest-test2.text文件指定这些信息

Step4.2 执行Jar包生成命令

可以看到在lib目录下生成了Test2.jar
Step5.运行我们的可执行Jar

大功告成了,我们的SbDemo项目Run起来了...
当然实际项目不可能人肉编译,打包。我们需要通过Maven/Gradle等构建工具,帮助我们管理代码之间的Jar包依赖,构建,部署...我们可能大多时候通过点一下IDE就托管了Maven的构建部署命令。
拿Maven举例子,Maven首先定义了一套项目结构,我们按照它的结构书写代码,引入各个模块所需要的Jar包依赖。然后Maven可以通过自己的生命周期管理项目的清理,构建,打包,部署阶段。每个阶段有对应的Maven插件执行相应的目标。IDE又整合了Maven,使我们通过点吧点吧按钮就完成了项目的运行。
但是当一个项目并没有按照规范的构建工具结构搭建,或者项目没有成功运行报错时,了解Java实际的编译运行过程会对理解、解决这类问题有所帮助。
好啦,限于篇幅,阿姨先不讲这些年Maven躺过的坑了,有想看的吗?关注,在看,转发三连回应下 >-<

参考资料:
[1].《编译原理》序 (゚´ω`゚)゚
[2].https://time.geekbang.org/column/article/11289
没了IDE,你的Java项目还能Run起来吗~的更多相关文章
- Linux上Makefile管理java项目
前面文章讲到了Linux上通过.spec文件与rpmbuild命令将java程序打包为RPM安装包, 现阶段遇到新的需求: 使用Makefile来操纵java的编译.打包 该需求以前面的内容为基础 可 ...
- Java编译运行环境讨论(复古但能加深对Java项目的理解)
Java编译运行环境讨论(复古但能加深对Java项目的理解) 如今我们大多数情况都会使用IDE来进行Java项目的开发,而一个如今众多优秀的IDE已经能够帮助我们自动的部署并调试运行我们的Java程序 ...
- eclipse — 导入android项目后识别成java项目的问题及解决
最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...
- Scala:Java 项目中混入scala代码
Spark 是用Scala代码写的.为了调试Spark,做了如下尝试. 1.Eclipse下:Java 项目 ,Using Maven,编写了一个java 版Spark应用. Spark的代码(sca ...
- Java基础14:离开IDE,使用java和javac构建项目
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- java web项目和java项目的区别(看清IDE本质)
想必大家在使用MyEclipse时对这两个概念不去深究.只知道是Java EE类的基本都是Web项目,而Java应用程序就是Java项目.而且很多人都愿意使用MyEclipse作为开发工具,且不说大家 ...
- 将 Maven生成的java项目转化为支持 Eclipse IDE的项目
转自: http://www.xuebuyuan.com/1297046.html 将 Maven生成的java项目转化为支持 Eclipse IDE的项目 在前一篇文章中,我们使用maven创建 ...
- java项目发布到linux服务器,tomcat正常启动但没加载项目
问题描述: java项目发布到linux服务器,一切操作正确,linux命令启动tomcat后,查看日志启动tomcat正常,上传的war包已经解压成功,但是tomcat没加载项目. 解决方法: 1. ...
- 转换基于Maven的Java项目支持Eclipse IDE
在过去的教程中,使用 Maven 创建了一个Java项目,但是这个项目不能导入到Eclipse IDE中,因为它不是 Eclipse 风格的项目. 这里有一个指南,向您演示如何转换 Maven 生成 ...
随机推荐
- 使用gitlab ci构建IOS包并发送通知消息到企业微信
在之前的文章中,我们介绍了使用gitlab ci构建Android包的方法.今天我们介绍使用gitlab ci如何构建IOS包,并且在打包成功或者失败时,如何将消息通知到企业微信. 如果对gitlab ...
- wordpress另一更新正在进行
登录mysql,然后进入wordpress数据库, use wordpress select * from wp_options where option_name='core_updater.loc ...
- 关于mysql中的锁总结
一.锁的基本信息: 共享锁(s):又称读锁.允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁.若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁 ...
- 08-Python之路---初识函数
Python之路---初识函数️ 程序员三大美德: 懒惰 因为一直致力于减少工作的总工作量. 缺乏耐性 因为一旦让你去做本该计算机完成的事,你将会怒不可遏. 傲慢 因为被荣誉感冲晕头的你会把程序写得让 ...
- 阿里云部署Java开发环境
阿里云部署Java网站和微信开发调试心得技巧(上) 本文主要是记录在阿里云服务器从零开始搭建Java执行环境并且部署web project的过程,方面以后查阅. 一.申请阿里云服务器 购买阿里云服务器 ...
- uni-app运行到浏览器跨域H5页面的跨域问题解决方案
官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...
- [Wireshark]_003_电子邮件抓包分析
电子邮件是我们的生活工作中经常使用的一种服务,用来联系世界各地的朋友,客户.下面我们就用Wireshark对电子邮件进行抓包. 准备工作: 邮件客户端一款(Outlook,Foxmail,KooMai ...
- VNC远程控制,如何使用VNC远程控制来管理公司?
VNC是功能强大的远程操作软件,可以实现日常的远程连接操作:如果稍加利用,可以实现公司的日常管理:既能够节省自身的时间,还可高效的完成这个功能! 我们可以使用:服务器管理工具来进行相关的操作 一.首先 ...
- Unity 游戏框架搭建 2019 (五十六/五十七) 需求分析-架构中最重要的一环&从 EmptyGO 到 Manager Of Managers
我们的项目开始立项的时候,最常见的一个情况就是:几个人的小团队,一开始什么也不做,就开始写代码,验证逻辑,游戏就开始写起来了.而公司的一些所谓的领导层面一开始就把游戏定义为我们要做一个大作.这个事情本 ...
- JavaScript (六) js的基本语法 - - - Math 及 Date对象、String对象、Array对象
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Math 1.Math对象的案例 var result= Math.max(10,20,30,40) ...