(转)JAVA路径问题及命令行编译运行基础(linux下)
原地址: http://blog.csdn.net/biaobiaoqi/article/details/6846274
java的运行机制的基本概念:
源文件 也就是我们熟知的.java文件。
类文件 .class 文件是编译器由.java文件编译而成。众所周知,Java的跨平台性在于Java虚拟机(JVM)这一层对硬件的隔离,而.class文件可以理解为 JVM中的执行文件(自己的理解,可能不太准确)。里面存储的是java字节码,java bytecode 是基于栈的(stack based)(关于字节码和JVM更详细的官方解释可以参照 The Java Virtual Machine Specification ,如果嫌那本书太厚,另外再推荐一本 Programming for the Java Virtual Machine)。
编译 Java的编译一般是指从源文件(.java文件)到类文件(.class文件)的转化过程。在JDK命令行中是 javac 命令(java compiler的缩写~跟C语言木关系的~)
运行 在JVM中执行.class文件。是 java 命令。
CLASSPATH 环境变量, 存储着编译某文件或运行某类时,所要搜索的目录。 比如:在Hello.java中有使用到一个第三方包ThirdPart.jar中的类,那么必须在classpath中添加相应的路径,让编译器能找到 它。(注意~把ThirdParty.jar放在当前的工作目录下,没有告诉环境变量也是不行的~编译器只认环境变量的!)同样的道理,在运行某类文件 时,有涉及到第三方jar包的也必须添加到CLASSPATH中。一般的,有三种方式修改环境变量。
1.在javac 或者java命令中,使用 -classpath 选项,后面跟着需要的目录地址。显然,这种方法只能在当前语句范围内生效。
2.直接命令行修改CLASSPATH或者PATH # PATH=$JAVA_HOME/bin:/home/username/bin
#export PATH
不过这种方法只能在此次运行中生效。
3.永久生效的方法是修改配置文件。在 /etc/profile 或者 /etc/profile.d 或者其他,不同操作系统发行版地点不同。在文件中加上CLASSPATH=......(相应路径),重启电脑即可(也可一执行source命令,那样不 用重启就已经生效啦~# source /etc/profile.d(ubuntu 使用source /etc/profile) 其实 . 跟source是一样的效果噢~ #. /etc/profile.d )
PATH环境变量 跟CLASSPATH 类似,只不过它不是用来寻找类的,而是用来寻找java相关执行文件的。可以通过 java -version 命令来查看自己是否已经设置好了PATH(如果显示了详细java信息,则已经设置好了,没有的话,还需要找到java的安装位置,重新设置)
环境变量的具体相关信息,参照doc PATH and CLASSPATH 和 Setting the class path。
jar包
java里用package的概念避免重复命名的问题。有点像C++的namespace。同一个包里的类是可以直接使用的。不同包的话,则需要在.java文件头部import进对应的package。初学者写的helloworld程序当然是不用注意到包的问题,但当工程越来越大,重复命名的可能性增大,我们就必须依靠package的概念来更好的管理我们的代码了。
同时,为了方便管理、传输,jar包出现了。
jar包其实是用zip压缩的文件包。我们可以打包自己的package,方便复用,到哪果 然,也可以直接引用文件夹(此时注意,必须引用文件夹的根目录,比如文件定义为package mypackage.foo , 那个必须将myapackage这个文件夹连同内部的foo文件一起放在相应的路径上)
制作jar压缩包和解压缩包的命令如下:
jar -cvf foo.jar foo
其中最后一个参数为需要压缩的文件包。-cvf几个选项中,f必须放在最后,f后面紧跟的必须是output的文件名。v表示输出详细信息(verbose)
对应的解压缩命令为:
jar -xvf foo.jar
注意其中有个可选的mainifest文件,在META-INF/MANIFEST.MF路径上。
我们可以在manifest.mf文件中加入如下语句
Main-Class: myPackage.MyClass
指定MyClass类为具有main()入口的主类。再利用如下语句,就可以值执行对应的程序了
java -jar foo.jar
命令
javac命令:编译源文件
-classpath 初学者必须掌握的options ,后接类中使用到的第三方类(形式可以是jar或者zip或者直接就是文件包)的目录。linux下,多个目录用冒号 : 分隔。
值得注意的是,-classpath中的内容是会覆盖掉环境变量classpath中的内容的~
-cp 是 -classpath的缩写
-d 制定生成的.class文件存放的目录。
-o 此选项告诉javac优化由内联的static、final以及privite成员函数所产生的码。
-verbose 此选项告知Java显示出有关被编译的源文件和任何被调用类库的信息。比如 -verbose:class 能看到各种类加载的信息。 -verbose:gc是garbage collection的信息。
还有许多option平时用的不多(话说我也其实只是刚会用,并不熟练直接在命令行环境下的调试编译 = =),需要用的时候直接翻阅 man javac 好了。
java 命令:加载运行类文件
-classpath 跟javac中的-classpath同样的道理。
-cp 也就是 -classpath的缩写啦。
-jar 执行在jar包上定义的主类的程序
一个.java文件的编译、运行示例如下:
# javac -classpath ./:/home/username/bin/ThirdParty.jar Hello.java
#java -classpath ./:/home/username/bin/ThirdParty.jar Hello
另外,对于带有package信息的java文件,执行如下:
$ ls . #Current directory contains the "x"package
x
$ ls x #The"x"package contains a Sample.java file...Sample.java
$ cat x/Sample.java #...which looks like this.package x;publicclassSample{
publicstaticvoid main(String... args){
System.out.println("Hello from Sample class");
}}
$ javac x/Sample.java #Use"/" as delimiter and
# include the ".java"-suffix when compiling.
$ java x.Sample #Use"." as delimiter when running, and don't include
# the ".class" suffix.Hello from Sampleclass
补充:eclipse的路径
eclipse下,每个project都可以控制路径。
1.在package explorer目录下,右击自己的project。下拉菜单中点击最底部的properties,弹出的窗口的左侧,有Java Build Path这一选项卡。
这里主要是对其他工程包、第三方jar包的路径引入,也有对project中源文件路径的设置。
2.在run的下拉菜单中(就是那个绿色的Run开始按钮),选择Run Configuration.
在每个运行的程序中,都有main、argument、JRE、classpath、source、environment、common这几个选项卡。
其中argument里可以设置java命令行运行时的参数。也就试main(String[] args)中的args。
classpath里可以设置system classloader加载类时的查找目录。(关于类的加载,可以参照另几篇文章classloader 三原则 和java 类加载器浅析 )
雷区:
1. 在linux下运行时,添加目录,千万不要弄错分割符。windows下是 \ ,而linux下是 / 。
2. 运行类时,不用加.class。比如有一个类Hello.class,运行命令是 # java Hello 而不是 #java Hello.class 。运行机制中是寻找类,而不是像编译的时候那样找到某个文件。
3. 如果引用的类有package层次,引用的路径是包层次的起点,而不可以延伸到包中的某个目录层次。
比如引用了~/workspace目录下的第三方类 com.thirdparty.hello ,在java命令的 -classpath
输入的是第三方类的包的根目录所在位置: #java -classpath ~/workspaceHello,而不能是java
-classpath ~/workspace/com/thirdparty
Hello。
NoSuchMethodException!
在运行自己的程序时,遇到了这个问题。查找了很多资料,最后发现原来是路径问题!原来的路径中,一个老版本的.class文件是在优先的位置上,于是每次invoke一个新写的method时,就出现这个错误 = =。
(转)JAVA路径问题及命令行编译运行基础(linux下)的更多相关文章
- 命令行编译运行Java
首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...
- 终端命令行编译运行C#程序HelloWorld
终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...
- java命令行编译运行、打包jar
过程:java文件→class文件→exe执行文件 --------------------------------------------- 一.编译:从.java生成.class (1)ecl ...
- Java无包结构命令行编译
无包结构的命令行编译运行方式 如果图片损坏,点击链接:https://www.toutiao.com/i6491250431673500173/ 利用记事本编写一段简单的代码,文件名和类名要一致. 将 ...
- 【linux基础】使用命令行编译运行c++程序
前言 在linux系统运行程序,小鹅知道的有3种编译方式,一种是直接命令行编译,一种是使用Cmake,一种是使用脚本文件(*.sh).本文介绍的是使用命令行编译. 使用过程 注意不同系统的编译器版本可 ...
- java 命令行 编译 运行程序
学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lk ...
- 用命令行编译运行java文件的乱码问题
之前在写的时候没有遇到过这个问题,用惯了eclipse之后突然用Notepad++就出现乱码了 我在编写的时候 指定Noepad++的编码是 UTF-8编码,然后进入命令行,编译的时候就出现了乱码 然 ...
- Windows下使用MinGW在命令行编译运行C++程序
之前学习C语言的时候都是用IDE类似CodeBlocks的工具写完直接编译运行的,今天突然心血来潮,自己下一个编译器,在命令行下,编译运行C++程序,了解一下编译过程. 一.安装编译器 首先你需要下载 ...
- Matlab命令行编译运行HelloWorld
Matlab安装完成后用记事本写一个文件HelloWorld.m内容如下: function HelloWorld() disp('Hello,World!'); end 保存后在命令行中切到Hell ...
随机推荐
- hadoop中datanode无法启动
一.问题描述 当我多次格式化文件系统时,如 [hadoop@xsh hadoop]$ ./bin/hdfs namenode -format 会出现datanode无法启动,查看日志(/usr/loc ...
- php 与 jquery中$.post()与attr()方法的简单实例 amaze modal 模态窗口
$(selector).attr(attribute,value)$.post() 在jqery中有这样一个方法,$.post()下面就这个方法做一个简单的实例: jQuery.post( url, ...
- 使用 OpenWrt Image Generator 为 WR703N 路由器定制固件
标题:使用 OpenWrt Image Generator 为 WR703N 路由器定制固件 之前试着自己编译固件,编译是成功了,但是在后期安装官方仓库的ipk时出现问题,因为自己编译的固件和官方固件 ...
- 我和小美的撸码日记(1)之软件也需靠脸吃饭,带您做张明星脸(附后台经典框架 DEMO 下载)
众所周知程序员得靠技术吃饭,但是真的光靠技术就够了吗?Teacher苍,一位德艺双馨的艺术家,论技术她自然是炉火纯青,我觉得她桃李遍天下的原因不仅限于些,试想如果Teacher苍长得跟凤姐一样再带点乡 ...
- Dijkstra算法C#实现及其布线运用
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下是空调布线对Dijkstra算法的运用,采用C#实现. 问题:室内机多台,室外机一台.寻找室内 ...
- AFNetworking 官方文档
AFNetworking Version Minimum iOS Target Minimum OS X Target Notes 2.x iOS 6 OS X 10.8 Xcode 5 is req ...
- IOS发送Email的两种方法-备
1.openURL 使用openURL调用系统邮箱客户端是我们在IOS3.0以下实现发邮件功能的主要手段.我们可以通过设置url里的相关参数来指定邮件的内容,不过其缺点很明显,这样的过程会导致程序暂时 ...
- hdu 3339 In Action
http://acm.hdu.edu.cn/showproblem.php?pid=3339 这道题就是dijkstra+01背包,先求一遍最短路,再用01背包求. #include <cstd ...
- UVA1218--树形DP
没有看书和题解做的一道树形DP题,思路很清晰..只是debug上花了很久的时间才发现看错了条件..并不是每个点都只能和一台服务器相邻,而是非服务器的点只能和一台服务器相邻..看错了一个条件差距大了去了 ...
- jdbc连接数据库工具类
import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DriverManager; import ja ...