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

下面使用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. 生动有趣地讲解Map/Reduce基本原理

    Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...

  2. 在Mac中安装python,配置python环境

    参考链接:http://blog.justbilt.com/2014/07/02/setup_python_on_mac/ 其实跟windows差不多,就是在python官网下载特定版本的python ...

  3. webpack新版本4.12应用九(配置文件之入口和上下文(entry and context))

    entry 对象是用于 webpack 查找启动并构建 bundle.其上下文是入口文件所处的目录的绝对路径的字符串. context string 基础目录,绝对路径,用于从配置中解析入口起点(en ...

  4. Linux环境安装redis

    redis官网地址:http://www.redis.io/ 最新版本:2.8.3 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1.下载源码,解压缩后编译源码. $ wget ...

  5. 程序4-3 umask函数实例

    //http://blog.chinaunix.net/uid-24549279-id-71355.html /* ========================================== ...

  6. 字符串(PHP学习)

    1.什么是字符串 答:一串字符组成(参考羊肉串) 2.字符串定义 答:单引号,双引号,包含单引号或双引号的字符串(1.双引号里面有单引号2.单引号里面有双引号3.转义4.字符拼接) 3.单双引号定义字 ...

  7. Win10的Hosts文件修改后无法保存的问题解决方法,实测可以

    1.hosts文件是什么?有什么作用呢? Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个 ...

  8. An invalid form control with name='timeone[]' is not focusable.

    在项目开发的时候 遇到了这样的报错 An invalid form control with name='timeone[]' is not focusable. 学习源头:https://segme ...

  9. 蓝桥杯 基础练习 BASIC-30 阶乘计算

    基础练习 阶乘计算   时间限制:1.0s   内存限制:512.0MB 问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*…*n. 算法描述 n!可能很大,而计算机能表示的整数范围有 ...

  10. java代码把字母转换大小写、、、、

    总结:从键盘输入多少次,就用for循环控制.这些需要输入的数据都放在循环内部,否则不会执行多次. package com.aaa; import java.util.Scanner; //大小写字母的 ...