计算机只能识别机器码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实际的编译运行过程会对理解、解决这类问题有所帮助。

文中提到的命令均可通过command -help进一步了解可用参数,如javac -help

参考资料:

[1].《编译原理》序   (゚´ω`゚)゚ [2].https://time.geekbang.org/column/article/11289

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

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

  1. 没了 IDE,你的 Java 项目还能跑起来吗?

    作者 | Monica2333 责编 | 屠敏 来源 | 码农知识点 计算机只能识别机器码0101...编程语言->能执行的机器码 需要经过 预处理->编译->汇编->链接-& ...

  2. Java 项目还需要 joda 吗

    因为众所周知的原因,老的 Java 中的日期处理是非常不好用但是又不得不用的 API. 而且经常混乱还容易出错,相信大家应该都用过救民于水火的 joda Datetime 对象吧,简直是活菩萨. 时间 ...

  3. JAVA 命令行运行java项目

    多年以来 一直使用的是IDE 来写java 项目,导致很多的最基础的东西都渐渐模糊了. 最近遇到一个问题就是如果命令行来运行一个java项目 当然这不是初学的那个运行 HelloWord.java , ...

  4. 超强使用干货!教你如何吃透一个Java项目

    整理了一些Java项目,分享给大家 1. 一款Java开源的Spring Boot即时通讯IM聊天系统 地址:一款Java开源的Spring Boot即时通讯IM聊天系统 2. Java外卖点餐系统[ ...

  5. eclipse怎样创建并运行java项目

    今天为大家介绍一下怎样创建java项目,以及怎样运行一个简单的java类,对myeclipse的功能很强大,大家可以继续深入的研究...... 工具/原料 电脑 myeclipse 方法/步骤 1 打 ...

  6. 如何直接用maven创建java项目,不用eclipse,不用idea,不用任何ide

    不用eclipse,不用idea,不用任何ide,如何直接用maven创建java项目 写作背景 maven简介 安装maven 配置镜像与本地仓库 更改镜像下载地址 更改本地仓库 配置环境变量 建立 ...

  7. 35岁 学java_35岁没基础,现在去学java编程还来得及吗?应该注意哪些事项?

    话说得好,活到老,学到老.人生必须不断学习和进步,否则很容易被社会淘汰.况且如今正是科技高速发展时期,技术更新非常快,稍微放松自己,不思进取,就会落后了. 对于题主的问题,35岁没基础,想学习Java ...

  8. 【Java】什么?你项目还在用Date表示时间?!日期类LocalDateTime的使用

    什么?你项目还在用Date表示时间?! 这都什么年代了,怎么还在用 Date来处理和表示时间! 别的先不说,我们先来看几个关于 Date用法的例子,这玩意真的好用吗? 一.我想新建一个表示" ...

  9. idea 新建的java项目没发run_IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行...

    首先,确保 IDEA 软件正确安装完成,Java 开发工具包 JDK 安装完成. IDEA 的 Java 项目 (Project) 则相当于 Eclipse 的工作空间 (workspace) 的概念 ...

最新文章

  1. 计算机组成原理文华学院,华中科技大学文华学院计算机组成原理课设.doc
  2. 测试mktime和localtime_r性能及优化方法
  3. 【翻译】关于回调地狱
  4. 入门训练 Fibonacci数列-python实现
  5. 开课吧python好吗-如何选择python培训机构?开课吧python培训怎么样?
  6. tf.ensure_shape 感觉这个功能有点鸡肋
  7. Java多线程编程模式实战指南(三):Two-phase Termination模式--转载
  8. 保存的图数据丢失_自从用了这2个功能,再也没有担心过文档丢失
  9. Intent.ACTION_MAIN
  10. java获取xml参数
  11. timeSetEvent、回调函数、CCriticalSection
  12. Cacti设置流量阀值实现邮件报警
  13. vscode无法打开源文件iostream_C++的iostream标准库介绍(1)
  14. OpenERP 中的on_change方法总结
  15. java中位于集合框架顶层位置的是,CoreJava第二次内测有答案
  16. 解决AndroidStudio引入Jar出现Unable to resolve dependency for ':app@debug/compileClasspath
  17. 独孤木专栏Delayed Project(中) (转)
  18. Ti437x LED裸机程序全解
  19. 从315晚会曝光网秦谈企业社会责任
  20. sublime text 3搭建Python3的开发环境

热门文章

  1. 华为手机8.0.0怎么找到云相册_华为G9怎么找到云相册_失而复得 华为“查找手机”功能有多强大?快来了解一下......
  2. docker 本地部署 mysql_Docker 部署Mysql 服务和Redis 服务的方法
  3. java akka 实战_Akka实战:分散、聚合模式
  4. yapi 插件_精神多了,当Swagger遇上YApi,瞬间高大上了!
  5. 2020下半年新机最新消息_三星小米华为苹果纷纷曝光高端机,这么多你选择谁?...
  6. geteditor p 取消自动_自动挡汽车最热问题,N档到底是干什么用的?
  7. (软件工程复习核心重点)第十二章软件项目管理习题
  8. poj1753 Flip Game
  9. CVE-2019-15107 Webmin远程命令执行漏洞复现
  10. error while loading shared libraries: libgconf-2.so.4