首页 > 代码库 > javac java 命令行编译运行程序

javac java 命令行编译运行程序

参考自:http://blog.csdn.net/xxyyww/article/details/5784803

前言:

在命令行运行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.java

6 directories, 3 files
laolang@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=http://www.mamicode.com/src> 


   运行效果:



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

6 directories, 3 files
laolang@laolang:~/code/gongda/data_java/test3$ make
javac -sourcepath src  src/com/laolang/main/Main.java -d classes
laolang@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.java

10 directories, 5 files
laolang@laolang:~/code/gongda/data_java/test3$ make run
java -classpath classes com.laolang.main.Main
Person [name=小代码, birthday=91-12-06, desc=程序员]
laolang@laolang:~/code/gongda/data_java/test3$ make clean
cd 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.java

6 directories, 3 files
laolang@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.java

9 directories, 6 files
laolang@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	<?xml version="1.0" encoding="UTF-8"?>
     2	<PerList>
     3		<Person>
     4			<name>小代码</name>
     5			<birthday>91-12-06</birthday>
     6			<desc>一个神一样的男人</desc>
     7		</Person>
     8	
     9		<Person>
    10			<name>天涯</name>
    11			<birthday>91-11-01</birthday>
    12			<desc>流浪者</desc>
    13		</Person>
    14	
    15		<Person>
    16			<name>老狼</name>
    17			<birthday>71-12-06</birthday>
    18			<desc>杀手</desc>
    19		</Person>
    20	
    21		<Person>
    22			<name>行者</name>
    23			<birthday>81-12-06</birthday>
    24			<desc>出家人</desc>
    25		</Person>
    26	</PerList>
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=http://www.mamicode.com/src> 




运行效果:


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.java

9 directories, 6 files
laolang@laolang:~/code/gongda/data_java/test2$ make
javac -sourcepath src -classpath classes:lib/dom4j.jar src/com/laolang/main/Main.java -d classes
laolang@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.java

14 directories, 9 files
laolang@laolang:~/code/gongda/data_java/test2$ make run
java -classpath classes:lib/dom4j.jar com.laolang.main.Main
Person [name=小代码, birthday=91-12-06, desc=程序员]
PerList
Person
name
birthday
desc
Person
name
birthday
desc
Person
name
birthday
desc
Person
name
birthday
desc
laolang@laolang:~/code/gongda/data_java/test2$ make clean
cd 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.java

9 directories, 6 files
laolang@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
这里和上面的一样



javac java 命令行编译运行程序