使用javac编译Java项目

在缺乏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 dirs = getSourceDirs(new File(sourcePath));

        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 getSourceDirs(File file) {
        Set resultDirs = new HashSet<>();
        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文件夹(没有会自动创建)
               路径格式支持绝对路径和相对路径, 但是不支持../    

 

 

你可能感兴趣的:(Jdk命令工具)