今天在使用命令行编译时遇到些问题,顺便又仔细分析了一些基础知识,记录总结一下。

下面使用javac和java命令都是在 D:\Workspace\java目录下执行的:

 1 //Inner.java
2 package cn.inner;
3 public class Inner
4 {
5 public static void show()
6 {
7 System.out.println("I'am inner class.");
8 }
9 }
10
11 //DoTest.java
12 import cn.inner.*;
13 public class DoTest
14 {
15 public static void main(String[] args)
16 {
17 Inner.show();
18 }
19 }

javac -d . Inner.java

javac DoTest.java

折腾半天,最终把 Inner.java 删掉、重命名都能够使 DoTest.java 编译成功。

自己思索半天,想到一个合理的解释: javac  命令在编译源文件时,如果源文件中有对其他类的调用(例如本例中的 Inner 类的调用),

它首先会在与源文件相同的目录下(即是与该类相同的包下)寻找是否有该类存在,在示例中发现了 Inner.java 源文件存在(该源文件中肯定存在一个 Inner 类),

但是事实上 Inner.java 是属于 cn.inner 包下的类,即 cn.inner.Inner 。 检查到这里, javac 命令就报错了,提示错误的源文件 ...

为了进一步证实我的假设,我修改 DoTest.java 文件,增加了默认包名:

package src;

在当前目录下执行:

Javac -d . DoTest.java

成功!

这时在分析下 DoTest.java 原源文件中导入的其它类:

由于该源文件中有导入 cn.inner.Inner 类,在使用 javac 命令编译时,该命令会按照 classpath 环境变量的路径去搜索导入的类,我的环境变量中有配置 "." ,

所以在当前目录下可以正确寻找到 cn.inner.Inner 类, 在当前目录下执行 javac DoTest.java  命令成功

但是在执行 java DoTest  命令时,出现下面的结果

这时才发现原来 DoTest.java 中增加了包名的限制,所以需要把 DoTest.class  文件移到 src 目录下,或者编译时加上 "-d ." 参数,即 javac -d . DoTest.java  命令

再执行 java src/DoTest  成功

总结: java 中包名的层级关系是用目录来体现的,比如 cn.inner 包就对应 cn\inner 这两层目录,在编译代码的过程中,如果有 import 其他包中的类,

则使用 javac 命令的命令行窗口的目录必须可以按照 classpath 环境变量的路径搜索到 import 进来的类。另外值得一提的是,编译后的类都应该按照包名规定放在指定目录下,

还需要注意被引入的类的源文件和使用引入类的源文件不能放在一起,除非两个文件都是默认包,如果是这种情况也不会使用 import 引入另外一个类了。

当然,我今天提到的这些问题,在 IDE 开发中一般都不会遇到,只是觉得这样能够更加深刻的理解 java 的一些基础问题。

命令行编译java的一点总结的更多相关文章

  1. 用命令行编译java并生成可执行的jar包

    用命令行编译java并生成可执行的jar包 1.编写源代码. 编写源文件:CardLayoutDemo.java并保存,例如:I:\myApp\CardLayoutDemo.java.程序结构如下: ...

  2. 命令行编译java项目

    命令行编译java项目 项目名: testproj 目录 src -> cn -> busix -> test bin lib 编译项目 cd testproj javac -d . ...

  3. 在linux下用命令行编译 java的eclipse项目

    由于jdk的版本问题导致在windows上编译打包好的jar包放在linux服务器上运行的时候出现一点小异常,所以决定在linux上进行一次项目编译,这有两个选择1.在相同的linux环境下安装lin ...

  4. Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决

    今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...

  5. 用cmd命令行编译JAVA程序时出现“找不到或无法加载主类”

    今天复习Java基础知识时,使用cmd命令窗口进行编译Java文件发现了如下问题: 网上有很多的解决方法,和问题出现的讨论,以下方法是解决我出现这个问题方式. 解决方式: 重点是圈住的部分. 下面是我 ...

  6. Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

    一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...

  7. 如何命令行编译Java工程

    在src下的包含Main的包下打开命令行,javac -classpath “路径到src,不到包下”  Main.java

  8. Java 命令行编译项目

    如果是用Exlipse, 第三方的包可以放在eclipse文件夹的jre包的lib文件夹中! (初学者的一些总结-高手们勿喷哈-) 原因: 以前一直用Eclispe编程环境运行Java.非常舒服,就像 ...

  9. 命令行编译运行Java

    首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...

随机推荐

  1. HDU - 6103 :Kirinriki(不错的尺取法)

    We define the distance of two strings A and B with same length n is dis A,B =∑ i=0 n−1 |A i −B n−1−i ...

  2. 重温CLR(六)方法和参数

    实例构造器和类(引用类型) 构造器是将类型的实例初始化为良好状态的特殊方法.构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称).创建引用类型的实例时,首先为实例的数据 ...

  3. matlab中一些常用的函数

    stem函数h = stem(x,y); %绘制火柴梗图 ,stem的工作原理是,根据一个x对应一个y,绘制火柴梗图.

  4. phpstorm2017.3.6的激活、样式设置和汉化

    一:安装phpstorm2017.3.6,并激活.设置样式.(1)先在phstorm官网里www.jetbrains.com下载phpstorm2017.3.6,按照步骤安装即可.下面开始激活!(2) ...

  5. jfrog artifactory jenkins pipeline 集成

    1. 预备环境 artifactory ( 开源版本 ) maven jenkins jenkins artifactory plugin (在插件管理安装即可) 2. 配置artifactory  ...

  6. iis部署网页时应该避免的特殊端口

    1 tcpmux 7 echo 9 discard 11 systat 13 daytime 15 netstat 17 qotd 19 chargen 20 ftp data 21 ftp cont ...

  7. xe 最大连接数限制、记录客户连接、心跳

    xe 最大连接数限制.记录客户连接.心跳   //author: cxg unit DSServerContainer; interface uses  SysUtils, Classes, IniF ...

  8. ROS探索总结(三)——ROS新手教程

    转自古-月 http://blog.csdn.net/hcx25909 前面我们介绍了ROS的特点和结构,接下来就要开始准备动手感受一下ROS的强大了. ROS官网的wiki上针对新手的教程很详细,最 ...

  9. 今天去python官网下载包安装的时候的问题记录

    去官网下载了 tar压缩包 放到了site-packages下解压 然后使用 python setup.py install 安装 安装完后,所要引用的模块文件居然还在解压出来的压缩文件里面,导致无法 ...

  10. android选中radiobutton后改变TextColor

    首先,看下效果图,以护照为例 然后选中护照后 可以看到 字体由黑色变成了白色 下面说下实现方法. 首先 在values文件夹下的color.xml文件中加入<drawable/>标签的颜色 ...