博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javac java 命令行编译运行程序
阅读量:6871 次
发布时间:2019-06-26

本文共 11768 字,大约阅读时间需要 39 分钟。

hot3.png

参考自:

前言:

在命令行运行JAVA的时候,要做的事情就不是点一下鼠标就可以了。如果再用到第三方JAR包,命令就更长了。一个比较好的方法就是使用ant,不过我发现一个问题,在命令行中使用ant的时候,它的输入和eclipse的console一样蛋疼。比如:

Scanner in = new Scanner(System.in);

System.out.println("请输入一个整数:");

int a = in.nextInt();

这三行代码的运行结果:

23

请输入一个整数

这显示不是我想要的,所以我这里用的是Makefile。另一个原因就是我还不太会ant

PS:这里不讨论例如不打包或者.class文件与.java文件在同一目录中的情况

不带第三方包的

我的文件布局

laolang@laolang:~/code/gongda/data_java/test3$ tree.├── classes├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            └── main                └── Main.java6 directories, 3 fileslaolang@laolang:~/code/gongda/data_java/test3$
Person.java

laolang@laolang:~/code/gongda/data_java/test3$ cat src/com/laolang/domain/Person.java      1	package com.laolang.domain;     2	     3	public class Person {     4	     5		public Person() {     6			super();     7			// TODO Auto-generated constructor stub     8		}     9	    10		public Person(String name, String birthday, String desc) {    11			super();    12			this.name = name;    13			this.birthday = birthday;    14			this.desc = desc;    15		}    16	    17		@Override    18		public String toString() {    19			return "Person [name=" + name + ", birthday=" + birthday    20					+ ", desc=" + desc + "]";    21		}    22	    23		public String getName() {    24			return name;    25		}    26	    27		public void setName(String name) {    28			this.name = name;    29		}    30	    31		public String getBirthday() {    32			return birthday;    33		}    34	    35		public void setBirthday(String birthday) {    36			this.birthday = birthday;    37		}    38	    39		public String getDesc() {    40			return desc;    41		}    42	    43		public void setDesc(String desc) {    44			this.desc = desc;    45		}    46	    47		private String name;    48		private String birthday;    49		private String desc;    50	}laolang@laolang:~/code/gongda/data_java/test3$
Main.java

laolang@laolang:~/code/gongda/data_java/test3$ cat src/com/laolang/main/Main.java      1	package com.laolang.main;     2	     3	     4	import com.laolang.domain.Person;     5	     6	public class Main {     7	     8		public static void main(String[] args) {     9			    10			Person person = new Person("小代码","91-12-06","程序员");    11			System.out.println(person);    12			    13		}    14	}laolang@laolang:~/code/gongda/data_java/test3$

我的Makefile

1	     2	# javac 命令     3	JAVAC=javac     4	# java命令     5	JAVA=java     6	     7	# .class 文件目录     8	CLASSES_DIR=classes     9	    10	# java源文件所在路径    11	JAVA_SRC=src    12	    13	# 启动类类名    14	MAINCLASS=com.laolang.main.Main    15	    16	# 启动类文件所在路径    17	MAINFILE=src/com/laolang/main/Main.java    18	    19	    20	comp:    21		$(JAVAC) -sourcepath $(JAVA_SRC)  $(MAINFILE) -d $(CLASSES_DIR)    22	    23	run:    24		$(JAVA) -classpath $(CLASSES_DIR) $(MAINCLASS)    25	    26	clean:    27		cd classes;rm -rfv com    28	laolang@laolang:~/code/gongda/data_java/test3$

   运行效果:

aolang@laolang:~/code/gongda/data_java/test3$ tree.├── classes├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            └── main                └── Main.java6 directories, 3 fileslaolang@laolang:~/code/gongda/data_java/test3$ makejavac -sourcepath src  src/com/laolang/main/Main.java -d classeslaolang@laolang:~/code/gongda/data_java/test3$ tree.├── classes│   └── com│       └── laolang│           ├── domain│           │   └── Person.class│           └── main│               └── Main.class├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            └── main                └── Main.java10 directories, 5 fileslaolang@laolang:~/code/gongda/data_java/test3$ make runjava -classpath classes com.laolang.main.MainPerson [name=小代码, birthday=91-12-06, desc=程序员]laolang@laolang:~/code/gongda/data_java/test3$ make cleancd classes;rm -rfv com已删除"com/laolang/main/Main.class"已删除目录:"com/laolang/main"已删除"com/laolang/domain/Person.class"已删除目录:"com/laolang/domain"已删除目录:"com/laolang"已删除目录:"com"laolang@laolang:~/code/gongda/data_java/test3$ tree.├── classes├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            └── main                └── Main.java6 directories, 3 fileslaolang@laolang:~/code/gongda/data_java/test3$

命令分析:

{其实也说不上分析,只是一个笔记}

其中编译的命令是:

javac -sourcepath src  src/com/laolang/main/Main.java -d classes

javac

        这个就不用说了

-sourcepath src

        来自javac自带的说明:-sourcepath <路径>           指定查找输入源文件的位置

        也就是指定源文件的位置

src/com/laolang/main/Main.java

        启动类的源文件

-d classes

        来自javac自带的说明:-d <目录>                    指定放置生成的类文件的位置

        这里说是指定生成的.class文件放到哪里

运行的命令:

java -classpath classes com.laolang.main.Main
java

        这个也不用说

-classpath classes

        -classpath 和 -cp 一样,区别就是一个是全称一个是简称,指定.class文件所在目录

com.laolang.main.Main

        启动类的.class文件

规范命令和代码布局

这里要说明的是比如我的源文件放在src下

Main.java与Person.java的打包代码分别是

        Main.java:package com.laolang.main;

        Person.java:package com.laolang.domain;

那么我的Main.java的路径应该是 src/com/laolang/main/Main.java

Person.java的路径应该是 src/com/laolang/domain/Person.java

然后我应该建立一个目录classes或者其它的什么,用来存放.class文件,这样使用javac命令时,使用-d classes选项就可以把.java文件和.class文件分开

带第三方jar包的

代码布局:

laolang@laolang:~/code/gongda/data_java/test2$ tree.├── classes├── data│   └── Person.xml├── lib│   └── dom4j.jar├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            ├── handle            │   └── XmlHandle.java            └── main                └── Main.java9 directories, 6 fileslaolang@laolang:~/code/gongda/data_java/test2$
XmlHandle.java

laolang@laolang:~/code/gongda/data_java/test2$ cat src/com/laolang/handle/XmlHandle.java      1	package com.laolang.handle;     2	     3	import java.io.File;     4	import java.util.Iterator;     5	     6	import org.dom4j.Document;     7	import org.dom4j.DocumentException;     8	import org.dom4j.Element;     9	import org.dom4j.io.SAXReader;    10	    11	public class XmlHandle {    12		    13		public static void main(String[] args) {    14			try {    15				XmlHandle handle = new XmlHandle("data/Person.xml");    16				handle.show();    17			} catch (DocumentException e) {    18				e.printStackTrace();    19			}    20		}    21	    22		public XmlHandle() {    23			super();    24		}    25	    26		public XmlHandle(String fileName) throws DocumentException {    27			this.fileName = fileName;    28			SAXReader sax = new SAXReader();    29			this.document = sax.read(new File(fileName));    30		}    31	    32		@Override    33		public String toString() {    34			return "XmlHanle [fileName=" + fileName + "]";    35		}    36	    37		public void show() {    38			Element root = this.document.getRootElement();    39			list(root);    40		}    41	    42		private void list(Element element) {    43			System.out.println(element.getName());    44	    45			Iterator it = element.elementIterator();    46	    47			while (it.hasNext()) {    48				Element e = (Element) it.next();    49				list(e);    50			}    51	    52		}    53	    54		public String getFileName() {    55			return fileName;    56		}    57	    58		public void setFileName(String fileName) {    59			this.fileName = fileName;    60		}    61	    62		private String fileName;    63	    64		private Document document;    65	    66	}laolang@laolang:~/code/gongda/data_java/test2$
Main.java

laolang@laolang:~/code/gongda/data_java/test2$ cat src/com/laolang/main/Main.java      1	package com.laolang.main;     2	     3	import org.dom4j.DocumentException;     4	     5	import com.laolang.domain.Person;     6	import com.laolang.handle.XmlHandle;     7	     8	public class Main {     9	    10		public static void main(String[] args) {    11			    12			Person person = new Person("小代码","91-12-06","程序员");    13			System.out.println(person);    14			    15			try {    16				XmlHandle handle = new XmlHandle("data/Person.xml");    17				handle.show();    18			} catch (DocumentException e) {    19				e.printStackTrace();    20			}    21		}    22	}laolang@laolang:~/code/gongda/data_java/test2$
Person.xml

laolang@laolang:~/code/gongda/data_java/test2$ cat data/Person.xml      1	
2
3
4
小代码
5
91-12-06
6
一个神一样的男人
7
8 9
10
天涯
11
91-11-01
12
流浪者
13
14 15
16
老狼
17
71-12-06
18
杀手
19
20 21
22
行者
23
81-12-06
24
出家人
25
26
laolang@laolang:~/code/gongda/data_java/test2$

我现在的Makefile

laolang@laolang:~/code/gongda/data_java/test2$ cat Makefile      1	     2	# javac 命令     3	JAVAC=javac     4	# java命令     5	JAVA=java     6	     7	# .class 文件目录     8	CLASSES_DIR=classes     9	    10	# java源文件所在路径    11	JAVA_SRC=src    12	    13	# 启动类类名    14	MAINCLASS=com.laolang.main.Main    15	    16	# 启动类所在路径    17	MAINFILE=src/com/laolang/main/Main.java    18	    19	# dom4j 所在路径    20	DOM4J=lib/dom4j.jar    21	    22	comp:    23		$(JAVAC) -sourcepath $(JAVA_SRC) -classpath $(CLASSES_DIR):$(DOM4J) $(MAINFILE) -d $(CLASSES_DIR)    24	    25	run:    26		$(JAVA) -classpath $(CLASSES_DIR):$(DOM4J) $(MAINCLASS)    27	    28	clean:    29		cd classes;rm -rfv com    30	laolang@laolang:~/code/gongda/data_java/test2$

运行效果:

laolang@laolang:~/code/gongda/data_java/test2$ tree.├── classes├── data│   └── Person.xml├── lib│   └── dom4j.jar├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            ├── handle            │   └── XmlHandle.java            └── main                └── Main.java9 directories, 6 fileslaolang@laolang:~/code/gongda/data_java/test2$ makejavac -sourcepath src -classpath classes:lib/dom4j.jar src/com/laolang/main/Main.java -d classeslaolang@laolang:~/code/gongda/data_java/test2$ tree.├── classes│   └── com│       └── laolang│           ├── domain│           │   └── Person.class│           ├── handle│           │   └── XmlHandle.class│           └── main│               └── Main.class├── data│   └── Person.xml├── lib│   └── dom4j.jar├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            ├── handle            │   └── XmlHandle.java            └── main                └── Main.java14 directories, 9 fileslaolang@laolang:~/code/gongda/data_java/test2$ make runjava -classpath classes:lib/dom4j.jar com.laolang.main.MainPerson [name=小代码, birthday=91-12-06, desc=程序员]PerListPersonnamebirthdaydescPersonnamebirthdaydescPersonnamebirthdaydescPersonnamebirthdaydesclaolang@laolang:~/code/gongda/data_java/test2$ make cleancd classes;rm -rfv com已删除"com/laolang/main/Main.class"已删除目录:"com/laolang/main"已删除"com/laolang/domain/Person.class"已删除目录:"com/laolang/domain"已删除"com/laolang/handle/XmlHandle.class"已删除目录:"com/laolang/handle"已删除目录:"com/laolang"已删除目录:"com"laolang@laolang:~/code/gongda/data_java/test2$ tree.├── classes├── data│   └── Person.xml├── lib│   └── dom4j.jar├── Makefile└── src    └── com        └── laolang            ├── domain            │   └── Person.java            ├── handle            │   └── XmlHandle.java            └── main                └── Main.java9 directories, 6 fileslaolang@laolang:~/code/gongda/data_java/test2$

命令分析:

编译命令

javac -sourcepath src -classpath classes:lib/dom4j.jar src/com/laolang/main/Main.java -d classes
这里重点是:-classpath classes:lib/dom4j.jar

暂时还不明白这样写的原理是什么,基本上就是有什么jar包,就在classes后面添加,多个jar包以冒号隔开,特此修正

我试了一个,不带第三方jar包时,编译命令加上 -classpath classes也是可以的

运行的命令:

java -classpath classes:lib/dom4j.jar com.laolang.main.Main
这里和上面的一样

转载于:https://my.oschina.net/iamhere/blog/355800

你可能感兴趣的文章
GlusterFS的基础应用
查看>>
DRBD+Heartbeat
查看>>
Ubuntu下vsftpd安装和配置
查看>>
IT运维之Linux服务器监控方案
查看>>
ORA-09925: Unable to create audit trail file Linux-x86_64
查看>>
安全存储专家usse
查看>>
MySQL数值类型
查看>>
TCP、UDP下的套接字编程
查看>>
jboss7-的默认系统日志
查看>>
python中的多进程和多线程
查看>>
如何跳出嵌套语句之return
查看>>
pycharm使用
查看>>
The producer group has been created before
查看>>
API概述
查看>>
python2.6 安装rsa的包
查看>>
undo表空间使用率过高,且迟迟不释放问题
查看>>
scons *** no sconstruct file found求解决办法
查看>>
BIND基础配置详解
查看>>
火狐增加安全端口,每次用都得查,好麻烦,自己记录一下
查看>>
c# 多线程排队队列实现的源码
查看>>