在缺乏eclipse和idea等IDE的工具的情况下,使用jdk自带的javac命令编译Java项目
当项目只有一个Java文件的时候,可以直接使用
javac 文件名.java
但是如果有多个源文件的时候, 例如项目结构如下:
com.rogueq.MainClass
package com.rogueq;
import com.rogueq.service.HelloService;
import com.rogueq.service.impl.HelloServiceImpl;
public class MainClass {
public static void main(String[] args) {
HelloService helloService = new HelloServiceImpl();
helloService.sayHello();
}
}
com.rogueq.service.HelloService
package com.rogueq.service;
public interface HelloService {
void sayHello();
}
com.rogueq.service.impl
package com.rogueq.service.impl;
import com.rogueq.service.HelloService;
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello() {
System.out.println("Hello world Manual Packaging !!!!!");
}
}
此时我们可以使用命令
javac -d out com/rogueq/*.java com/rogueq/service/*.java com/rogueq/service/impl/*.java
-d 参数指定class文件的输出目录
以上路径皆为相对路径(相对当前目录), 也可以使用绝对路径
上面的项目因为文件夹少,所以我们可以手动将所有还有java文件的文件路径写全,但是如果一个项目很大, 手动写则会比较耗时且容易出错。
所以需要我们自己写一个工具类 ManualCompile.java
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class ManualCompile {
private static final String USER_DIR = System.getProperty("user.dir");
private static final String FILE_SEPARATOR = System.getProperty("file.separator");
private static final String OS_NAME = System.getProperty("os.name");
public static void main(String[] args) throws IOException {
String sourcePath = USER_DIR;
if (args.length > 0) {
sourcePath = getPath(args[0]);
}
Set
String input = dirs.toString()
.replace(",", "")
.replace("[", "")
.replace("]", "");
System.out.println(input);
String output;
if (args.length >= 2) {
output = createDestDirectory(args[1]);
} else {
output = createDestDirectory("out");
}
// 打印将要执行的javac 命令
System.out.println("javac -d " + output + " " + input);
try {
// 执行javac编译操作
Runtime.getRuntime().exec("javac -d " + output + " " + input);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Failure");
}
System.out.println("SUCCESS, The dest path is [" + output + "]");
}
// 创建class文件的存放目录 默认路径为当前工作路径下的out文件夹
private static String createDestDirectory(String args) {
String destPath = getPath(args);
File file = new File(destPath);
if (!file.exists()) {
file.mkdirs();
}
return file.getAbsolutePath();
}
// 获取要编译的java源文件的目录, 并在目录的末尾添加上了 *.java
private static Set
Set
if (file.isFile() && file.getName().endsWith(".java")) {
resultDirs.add(file.getAbsolutePath().replace(file.getName(), "*.java"));
return resultDirs;
} else if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
resultDirs.addAll(getSourceDirs(f));
}
}
return resultDirs;
}
// 根据传入的参数获取当前项目工作路径
private static String getPath(String sourcePath) {
String path;
if (sourcePath == null) {
return USER_DIR;
}
path = sourcePath.trim();
if (!path.contains(":") && OS_NAME.toLowerCase().contains("windows")) {
if (path.startsWith("\\") || path.startsWith("/")) {
path = USER_DIR + path;
} else {
path = USER_DIR + FILE_SEPARATOR + path;
}
if (!(path.endsWith("\\") || path.endsWith("/"))) {
path += FILE_SEPARATOR;
}
}
if (OS_NAME.toLowerCase().contains("linux") && !path.startsWith("/")) {
path = USER_DIR + FILE_SEPARATOR + path;
}
return path.replace("\\", FILE_SEPARATOR).replace("/", FILE_SEPARATOR);
}
}
工具类功能说明如下:
当不传入参数的时候, 将编译当前目录下的文件
命令: (java ManualClass)
例如: 当前目录为 D:/project/hello 则会编译D:/project/hello 目录下的所有java文件 编译完成后的文件放置在 D:/project/hello/out文件夹中
当只传入一个参数的时候, 将编译该参数指定的目录下的文件
命令:(java ManualClass D:/project/hello)
例如: 当前目录为 D:/project/hello 参数为 D:/project/haha 则会编译D:/project/haha下的所有java文件 编译完成后的文件放置在 D:/project/hello/out文件夹中
当传入两参数的时候, 将编译第一个参数指定的目录下的文件 并把编译完成的class文件放入第二个目录指定的文件夹
命令:(java ManualClass D:/project/hello D:/project/hello/dest)
参数支持绝对路径和相对路径
例如: D:/project/haha 或 /heihei 但不支持 ../
总结:
第一个参数为要编译的java的文件夹或java文件 默认是当前目录
第二参数为编译完成的class文件的放置文件夹 默认是当前目录下的out文件夹(没有会自动创建)
路径格式支持绝对路径和相对路径, 但是不支持../