thinking in JAVA 编译记录
编辑/编译《thinking in JAVA》源代码
一、下载源代码
首先,我阅读的是《thinking in JAVA》第四版,因此按照书中提供的链接找到了mindview主页,并找到了对应下载链接:https://www.mindviewllc.com/quicklinks/,并跳转到https://github.com/BruceEckel/TIJ4-code进行下载,下载后解压到某个目录:
D:\source\TIJ4_code\ examples\,下面所有操作涉及到源代码工程路径的都是基于该路径(该路径下面存储了各个章节的源代码,比如exceptions,innerclasses等)。
二、原生态编译和运行(初级)
按照源代码一起发布的readme.me文档进行操作即可进行编译和运行,这里主要记录和说明在这过程中遇到的问题。基本的操作主要有:
1、解压源代码到某个目录,这里是D:\source\TIJ4_code\ examples\;
2、安装JDK,并将java/bin目录添加到PATH环境变量;
3、修改CLASSPATH,CLASSPATH=;.;..; D:\source\TIJ4_code\ examples\;
4、这时候,就可以编译和运行代码了。
cd D:\source\TIJ4_code\ examples\object
javac HelloDate.java
java HelloDate //此处即可得到正确的输出。
编译生成后的程序HelloDate.class,如果按照以下命令执行,
java HelloDate.class
java ./HelloDate.class
java ./HelloDate
都会失败,出现:错误: 找不到或无法加载主类 HelloDate
三、Vs code编辑,编译,运行(中级)
在第二节中已经实现了编辑(写字板或者notepad++),编译(javac),运行(java)当个java源文件,但是为了提高编辑效率,特别是使用IDE的智能补全功能,希望能够通过IDE来编辑,编译和运行这些源文件。IntelliJ IDEA功能很强大,但是比较庞大,对系统要求比较高,且加载比较慢,eclipse不够fashion,NetBeans界面跟eclipse也差不了多。结合到之前使用的vs code,决定用vs code+java扩展包来搭建简易的IDE。
3.1安装vs code 和java 插件
这个步骤稍微参考搜索引擎得到的结果就可以完成,略去;
3.2导入工程,并配置工程
1.导入工程。
File->Open Folder->选择D:\source\TIJ4_code\ examples\
这时候会在D:\source\TIJ4_code\examples\目录生成.vscode文件夹,并生成默认的launch.json和settings.json。
2.修改launch.json,添加configurations如下:
"configurations": [
{
"type": "java",
"name": "Debug (Launch) - object/Current File",
"request": "launch",
"cwd": "${workspaceFolder}/object",
"classPaths": [".;..;${workspaceFolder};"],
"mainClass": "${file}"
}
]
打开object/目录下的HelloDate.java,Debug->Start Debuging(F5)运行程序,如果之前已经编译过该源码,即object目录已经存在HelloDate.class的,程序正常运行,但是如果之前没有编译过源文件的,则会出现如下错误:
错误: 找不到或无法加载主类 HelloDate
这是因为建立的launch配置没有进行运行前的编译工作,因此需要通过新建task来完成。
3.新建编译task
Terminal->Configure Tasks,在新增的tasks.json中,新增如下内容:
"tasks": [
{
"label": "javac",
"type": "shell",
"command": "javac ${file}",
//"isBackground": true,
}
]
新建任务后,在launch配置中,加入该任务,得到新的launch.json文件,其配置章节如下:
{
"type": "java",
"name": "Debug (Launch) - object/Current File",
"request": "launch",
"cwd": "${workspaceFolder}/object",
"preLaunchTask": "javac",
"classPaths": [".;..;${workspaceFolder};"],
"mainClass": "${file}"
},
删除object/HelloDate.class(如果已经存在的话),打开object/HelloDate.java,在该文件执行Debug->Start Debuging操作,这次应该能够看到程序能够正常的被编译,运行。
4.建立更多configuration,适配其他目录源文件
如果希望编译D:\source\TIJ4_code\ examples\目录下,同object目录同等级的其他路径下的源文件(如exceptions,interfaces等)怎么办呢?当然可以直接修改上面object相关的配置文件,但是为了更加通用性,选择依葫芦画瓢,通过为每个二级目录(examples\exceptions, examples\interfaces等)分别建立一个configuration,通过name进行区分,同时修改对应的cwd参数即可,
{
"type": "java",
"name": "Debug (Launch) - object/Current File",
"request": "launch",
"cwd": "${workspaceFolder}/object",
"preLaunchTask": "javac",
"classPaths": [".;..;${workspaceFolder};"],
"mainClass": "${file}"
},
{
"type": "java",
"name": "Debug (Launch) - interfaces/Current File",
"request": "launch",
"cwd": "${workspaceFolder}/interfaces",
"preLaunchTask": "javac",
"classPaths": [".;..;${workspaceFolder};"],
"mainClass": "${file}"
},
这样,在编译不同二级路径(以examples\foobar\为例)下面的源代码时,只需做两件相关的事情:
a.在launch.json的configuration节中新增一个配置,具体可以直接从object配置clone过来后修改对应的name和cwd参数即可;
{
"type": "java",
"name": "Debug (Launch) - foobar/Current File",
"request": "launch",
"cwd": "${workspaceFolder}/foobar",
"preLaunchTask": "javac",
"classPaths": [".;..;${workspaceFolder};"],
"mainClass": "${file}"
},
b.在调试foobar/xxx.java之前,进入debug视窗,在DEBUG下拉框中,选择相应的配置文件:“foobar”配置;

之后,在打开的foobar/xxx.java上执行Debug->Start Debuging(或者直接按F5)即可进行编译和运行。
这种方法对于某些二级目录下面有多个文件夹下面的源代码也能正常工作,比如:
examples\interfaces\music4.java只需对二级目录examples\interfaces\执行上诉配置操作即可。这得益于这些三级目录下存储的源文件(*.java)通常有如下声明:
package 二级目录名称.三级目录名称; //package interfaces.music4;
thinking in JAVA 编译记录的更多相关文章
- java—— 编译与运行
内容:使用javac 指定编译多个目录下java文件 链接:http://zhidao.baidu.com/link?url=W5ZERu8_ouGD-L_JH0vqqawhJNitsGbonQAAT ...
- 浅谈java编译机制和运行机制
源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...
- java编译后字节码解析
java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260
- JAVA - JAVA编译运行过程
Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- java编译错误 程序包javax.servlet不存在javax.servlet.*
java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...
- Java编译过程、c/c++编译过程区别
Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. c/c++编译过程: 当C编译器编译生成一个对象的代码时,该 ...
- java编译自动化
java编译自动化 http://h2ofly.blog.51cto.com/6834926/1545452?utm_source=tuicool&utm_medium=referral
- 进行以上Java编译的时候,出现unmappable character for encoding GBK。
public class Exerc02{ public static void main(String args []){ char c = '中国人'; System.out.pingtln(c) ...
随机推荐
- linux网络通讯相关命令
ifconfig 1.查看当前使用的网卡 watch cat /proc/net/dev 看下哪张网卡的流量变化大一般就是哪张网卡是在线使用的 2.ifconfig查看所有网卡信息,ifconfig ...
- (转)python中@property详解
转:https://www.cnblogs.com/zhangfengxian/p/10199935.html
- ESP8266开发之旅 进阶篇⑥ ESP-specific APIs说明
1.前言 在介绍Arduino Core For ESP8266的时候,博主着重讲解了WIFI库的使用,但是并没有涉及到ESP8266硬件本身的一些特有API.所以,这一章我们将讲解ESP82 ...
- netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以s ...
- C# WPF基础巩固
时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 一.写作目的 做C# WPF开发,无论是工作中即将使用,还是只应付跳槽面试,开发基础是非 ...
- Spring cloud 学习笔记
前奏 1. 什么是微服务? 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,==每一个微服务提供单个业务功能的服务==,一个服务做一件事,从技术角度看就是一种 ...
- Markdown进阶(1)
对于工科生来说,在书写Markdown文本时,免不了要和上下标打交道,网上的博客大多良莠不齐,不太友好,本文想尽可能地解决一些在看完基础教程后再来书写Markdown文本时容易遇到的问题. 1.上下标 ...
- JVM概述和类加载器
JVM概述 1.Java虚拟机所管理的内存包括以下几个运行时数据区域: ①.程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是 ...
- 使用IDEA开发Spark程序
一.分布式估算圆周率 1.计算原理 假设正方形的面积S等于x²,而正方形的内切圆的面积C等于Pi×(x/2)²,因此圆面积与正方形面积之比C/S就为Pi/4,于是就有Pi=4×C/S. 可以利用计算机 ...
- NetworkManager网络通讯_破产版NetworkManager(五)
根据对NetWorkServer 以及NetworkClient的理解,编写一个简易版的NetWork Manager.惯例全部代码放在最后 (一)NetWorkServer与NetworkClien ...