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

使用javac编译Java项目相关推荐

  1. javac编译java文件之后 java运行找不到类的处理

    javac编译java文件之后,即使在同一个文件夹里面编译出了class文件java运行的时候也找不到运行的类,原因是已设置的classpath环境变量和class文件不在同一目录,java运行之前先 ...

  2. JavaSE —— 使用 Javac 编译 Java 程序

    使用 Javac 编译 Java 程序 新建一个 Java 文件 右键 选择 新建 文本文档 将文件后缀名改为 .java 注意:要勾选选上 显示 文件扩展名 编写 程序: public class ...

  3. 解决IEDA编译java项目出现 library root ,编译缺少 rt.jar jce.jar

    解决IEDA编译java项目出现 library root ,编译缺少 rt.jar jce.jar 问题 编译项目时,提示找不到rt.jar,编译添加后,出现缺少jce.jar,maven依赖项显示 ...

  4. 【Java】IDEA编译Java项目报错 java: 找不到符号 的解决方法

    IDEA编译Java项目报错java: 找不到符号,情况如下所示: 解决方法: 先删除out文件夹,然后选择File → Invalidate Caches → Invalidate and Rest ...

  5. Ant编译Java项目-QuickStart

    Ant是专门为Java开发的一款编译工具,很多开源工具都能通过Ant配置文件轻松运行,掌握这个工具对以后编译管理项目很有用处. Ant下载安装 登陆官网http://ant.apache.org/ 下 ...

  6. java命令javac java,使用命令行JAVAC编译Java

    我对使用cmd行 javac进行编译有点新,我在编译这个简单的Base-Interface类时遇到了问题 package com.apress.prospring2.ch03.di; /** * @a ...

  7. Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...

  8. 在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279

    操作背景:我在eclipse建立了个HelloWorld.java文件,格式UTF-8,然后复制保存到C:\Users\alex\test目录下,在此处运行按住Shift+右键调出cmd命令窗口,输入 ...

  9. idea编译Java项目的部分java文件并且生成class文件

    设置class文件的生成位置 file->project structure out put 选择第二个设置输出位置 设置resource和source 方法:点击文件右键->make d ...

最新文章

  1. 决策树Decision Tree
  2. 雷电2接口_地表最强?代替电脑的所有接口,雷电3或有望一统接口江湖
  3. [leetcode]83.Remove Duplicates from Sorted List
  4. 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
  5. 打击侵犯公民个人信息罪的司法困境
  6. VFP访问外部数据源的几种方法
  7. http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9332 多broser
  8. Effective C++ -----条款05:了解C++默默编写并调用哪些函数
  9. mysql 查询缓存及设置
  10. 黑猫论坛实战免杀教程
  11. 苹果ipad8和ipad9的区别
  12. 【渝粤教育】国家开放大学2018年春季 8639-21T食品营养与健康 参考试题
  13. 开机自动随机改计算机名,【优化电脑·禁止随机启动项·加速开机】
  14. 超级硬干货| 电脑蓝屏代码大全及解决办法合集
  15. Python基础——修改Python字典中的key(键)
  16. Arcpy基础入门-2、arcpy的批处理功能
  17. i5 13600K和i5 12600k差距
  18. 泛型的基础概念,T和?的使用方法和区别
  19. python中用什么函数读取字符串_Python(2)字符串的主要方法
  20. python 人生的第一个小爬虫 爬小说 保存一下

热门文章

  1. 2022广西南宁市青秀区南湖街道招录社区工作人员复习题及答案
  2. 嘉兴南湖区招聘计算机,2018浙江嘉兴南湖区招聘社区工作者8名公告
  3. JAVA SE(基础 第1篇)
  4. 神经网络算法是黑盒_在黑盒内窥视如何欺骗神经网络
  5. 51nod3047 位移运算
  6. LeetCode第176场周赛(Weekly Contest 176)解题报告
  7. 低代码如何助力广播媒体行业构建数字系统
  8. RubyMine插件30/8/21
  9. 淘客一招学会提高流量
  10. void在c语言没有返回值,c语言中的void和void*