Java编译运行环境讨论(复古但能加深对Java项目的理解)
Java编译运行环境讨论(复古但能加深对Java项目的理解)
如今我们大多数情况都会使用IDE来进行Java项目的开发,而一个如今众多优秀的IDE已经能够帮助我们自动的部署并调试运行我们的Java程序。然而在早期我们进行Java开始需要手动的建立逻辑包(package)与目录来管理我们的Java项目或是更高级一点的则是使用ant这样的构建工具。作为Javaer,对于Java的编译过程应当是熟悉的,这样即使脱离了IDE我们依然能够很好的理解Java的构建过程。
初级
我们首先建立一个基础的项目文件夹java-demo,并在其中建立Main.java文件:
$ vim Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
tips:
在Java中,.java文件中至多有一个共有类,并且文件名和改共有类相同,如果没有共有类,则任选一个类名作为文件名即可。
完成了我们的编辑工作之后,我们使用javac命令进行编译工作:
$ javac -d . ./Main.java
$ ls
Main.class Main.java
tips:上述的-d .表示在当前目录下生成class文件
之后我们可以使用java命令运行得到的.class文件(不需要带.class文件后缀)
$ java Main
Hello
初级++
在上述的示例中,我们并没有在代码中对我们的Java程序打包(package xxx;),我们知道Java中对程序进行package有很重要的意义:能够模块化程序,通过定义不同的包来实现模块化的开发,同时也能够帮助其他接手或者学习代码的人能够有很好的引导作用,能够明白整个Java项目模块的分布。
所以我们现在需要在代码中定义包,从而模块化我们的代码,这里我们在Main.java代码的第一句加上这样一句代码:
package src.main;
tips: 这句话代表了我先要把该Main类定义在包src包中的main包中
然后我们删除刚刚编译过的class文件,为了之后的生成class文件的删除方便,我们在java-demo文件夹下创建一个target文件夹,为以后的class文件的生成目标文件夹。
当前工作目录以及文件结构如下:
$ pwd
xxx/java-demo
# 目录结构
./
├── Main.java
└── target
接着我们重新编译
$ javac -d ./target Main.java
$ ls
Main.java target
进入target目录之后,我们可以看到如下的结构:
./
└── src
└── main
└── Main.class
我们可以看到,即使我们并没在原先的工作目录下创建src/main/Main.java这样的源码结构,只是在代码中定义了逻辑上的src.main,在javac之后,java会为我们自动生成这样的目录结构。
接下来我们通过java命令运行Main.class。这里有很重要的一点,通过我们上面的代码定义,我们最终生成的是一个名为src.main.Main类,不是单纯的名为Main类,不能像上面java Main那样去直接运行这个Java程序,同时我们应当在目标类生成的根目录下去运行java命令:
# 在target目录下
$ java src.main.Main(或者java src/main/Main)
Hello
即使我们进入到了target/src/main目录中(只要不是target/这样的目标根目录),直接使用java Main或者是java src.main.Main都是不行的。前者会提示:“错误: 找不到或无法加载主类 Main”, 原因就是我们定义是一个src.main.Main的类,很显然这里没有类名为Main的类;后者会提示:“错误: 找不到或无法加载主类 src.main.Main”,原因则是当我们使用java命令去运行譬如src.main.Main等在非默认包下的类时,java命令会自动将src.main.Main转换为 $classpath/ src/main/Main这样路径下的类文件,而你有没有定义classpath,那么java会在当前(这个例子就是main目录类),再找src/main/Main类,这里当然没有,所以报错。诚然,你可以在使用java命令时通过-classpath来指定类加载根路径,但是这样显然没有直接在类编译根目录下来的直接。
(初级++)++
目前为止,我们只讨论了只有一个类的情况,当我们在一个类中通过import来引入其他类的时候,又该注意什么呢?
首先我们重构整个文件目录结构如下:
xxx/java-demo
├── dir1
│ └── Main.java
├── dir2
│ └── Sub.java
└── target
首先在Sub.java中我们编写如下的代码:
package myutil;
public class Sub {
// 静态工具方法
public static void printWithFormat(String str) {
System.out.println(">>>" + str + "<<<");
}
}
然后编写Main.java中的代码:
package main;
// 引入Sub类
import myutil.Sub;
public class Main {
public static void main(String[] args) {
// 调用Sub类中的静态方法
Sub.printWithFormat("Hello");
}
}
这里我们定义了dir1、2两个文件加,虽然和Main类与Sub类中package的包名不同,但是,当我们在编译时,只要指定了正确目录下的对应的java类即可,就像我们可以进入dir1类中使用如下命令:
$ pwd
xxx/java-demo/dir1
$ javac -d ../target/ ./Main.java ../dir2/Sub.java # 自行理解对应文件的位置关系
接着我们查看对应的target下生成的class文件:
target/
├── main
│ └── Main.class
└── myutil
└── Sub.class
同样的,我们按照初级++中提到的,在根目录下,使用java main.Main命令,可以看到,没有问题:
$ java main.Main
>>>Hello<<<
关于java编译运行的路径相关的注意点大致就讲这些,以后会继续补充相关的更多的注意点。
Java编译运行环境讨论(复古但能加深对Java项目的理解)的更多相关文章
- Sublime Text3 for Java 编译运行环境配置 入门详解 - 精简归纳
Sublime Text3 for Java 编译运行环境配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 Sublime Text3 for ...
- EditPlus配置[C++] [Python] [Java] 编译运行环境
以前一直用Codeblocks写C++,eclipse写Java,再在eclipse里面集成PyDev写Python,首先无法忍受代码自动补全功能(这个功能也许你万分喜欢),也无法忍受如此重量级的ID ...
- Editplus配置java编译运行环境
1.进入配置环境界面 首先,从菜单"工具(Tools)"->"配置用户工具..."进入用户工具设置. 在类别里展开"工具"树形菜单-& ...
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- centos7最小版本安装nginx+tomcat+java+mysql运行环境
最近项目从windows搬到linux,由于项目组成员有限并且有其它紧急的任务需要处理,因而这个任务就落到我的头上了.下面记录下centos最小版本安装nginx+tomcat+mysql+java的 ...
- Linux下Java 编译运行说明
命令行环境下Java编译运行 1. java的运行机制的基本概念: 源文件 也就是我们熟知的.java文件. 类文件 .class文件是编译器由.java文件编译而成.众所周知,Java的跨平台性在 ...
- 如何在MyEclipse中配置jre的编译运行环境
由于在MyEclipse中已经自带了jre编译环境,但由于版本太低,所以有时候需要将编译环境配置为系统的jre版本.在MyEclipse中配置jre的编译运行环境很简单,只需要全局配置一次,则所有项目 ...
- JAVA EE 运行环境配置(包含JAVA SE)
JAVA EE 运行环境配置(包含JAVA SE) 1.下载并安装jre-7u7-windows-i586.exe (最新的JAVA运行环境) 2.下载并安装java_ee_sdk-6u4-jdk7- ...
- Java基础之Java编译运行过程
Java编译运行过程 程序员所编写的是以.java为后缀的文件,此文件操作系统不能正确识别,因此,首先要经过编译,生成所谓的字节码文件(.class),而字节码文件需要JVM来提供运行环境的支持. J ...
随机推荐
- YARN的工作过程
yarn的工作执行流程图 1.用户向YARN中提交应用程序 2.ResourceManager为该应用程序找到一个可用的NodeManager 并分配一个Container,然后在这个Containe ...
- T-SQL - query01_创建数据库|创建表|添加数据|简单查询
时间:2017-09-29 整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...
- Shell脚本基础及基本常用命令
1.概述 脚本语言(shell.python):解释性语言,用解释器解释 运行效率低 | c.java:描述性语言,运行效率高 以.sh结尾会有高亮显示 执行: sh hello.sh 或者 chmo ...
- 关于Cloudfront能否接入NLB的讨论
之前讨论过四层应用 是无法通过七层负载负载均衡器转发流量的,因为ALB监听的是Http/s协议,TCP/UDP的请求到了ALB无法识别,ALB在第七层做判断,数据包只有四层,会无法判断转发的目标.相反 ...
- SpringBoot详解(一)——
https://www.cnblogs.com/lifullmoon/p/14957771.html https://www.cnblogs.com/lifullmoon/p/14957751.htm ...
- windows/linux 页面编码区别导致 python 乱码
http://blog.csdn.net/haiross/article/details/36189103 可以先看下这篇文章..写的比较用心和详细并且高深..我只是记流水账的. 直到今天我才注意到 ...
- 【死磕NIO】— NIO基础详解
Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计.Java NIO 由三个核心组件组件: Buffer Channel Sele ...
- 数据治理中Oracle SQL和存储过程的数据血缘分析
数据治理中Oracle SQL和存储过程的数据血缘分析 数据治理中的一个重要基础工作是分析组织中数据的血缘关系.有了完整的数据血缘关系,我们可以用它进行数据溯源.表和字段变更的影响分析.数据合规性 ...
- SpringBoot-初见
目录 简单介绍 什么是SpingBoot? 微服务 单体应用架构 微服务架构 怎么构建微服务 第一个SpringBoot程序 官方网站快速构建 IDEA 代码 自动装配(要点) pom.xml 启动器 ...
- Python国内镜像源及报错解决方法
国内镜像源: 阿里云:https://mirrors.aliyun.com/pypi/simple/ 清华:https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科技 ...