使用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<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项目相关推荐
- javac编译java文件之后 java运行找不到类的处理
javac编译java文件之后,即使在同一个文件夹里面编译出了class文件java运行的时候也找不到运行的类,原因是已设置的classpath环境变量和class文件不在同一目录,java运行之前先 ...
- JavaSE —— 使用 Javac 编译 Java 程序
使用 Javac 编译 Java 程序 新建一个 Java 文件 右键 选择 新建 文本文档 将文件后缀名改为 .java 注意:要勾选选上 显示 文件扩展名 编写 程序: public class ...
- 解决IEDA编译java项目出现 library root ,编译缺少 rt.jar jce.jar
解决IEDA编译java项目出现 library root ,编译缺少 rt.jar jce.jar 问题 编译项目时,提示找不到rt.jar,编译添加后,出现缺少jce.jar,maven依赖项显示 ...
- 【Java】IDEA编译Java项目报错 java: 找不到符号 的解决方法
IDEA编译Java项目报错java: 找不到符号,情况如下所示: 解决方法: 先删除out文件夹,然后选择File → Invalidate Caches → Invalidate and Rest ...
- Ant编译Java项目-QuickStart
Ant是专门为Java开发的一款编译工具,很多开源工具都能通过Ant配置文件轻松运行,掌握这个工具对以后编译管理项目很有用处. Ant下载安装 登陆官网http://ant.apache.org/ 下 ...
- java命令javac java,使用命令行JAVAC编译Java
我对使用cmd行 javac进行编译有点新,我在编译这个简单的Base-Interface类时遇到了问题 package com.apress.prospring2.ch03.di; /** * @a ...
- Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)
实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...
- 在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
操作背景:我在eclipse建立了个HelloWorld.java文件,格式UTF-8,然后复制保存到C:\Users\alex\test目录下,在此处运行按住Shift+右键调出cmd命令窗口,输入 ...
- idea编译Java项目的部分java文件并且生成class文件
设置class文件的生成位置 file->project structure out put 选择第二个设置输出位置 设置resource和source 方法:点击文件右键->make d ...
最新文章
- 决策树Decision Tree
- 雷电2接口_地表最强?代替电脑的所有接口,雷电3或有望一统接口江湖
- [leetcode]83.Remove Duplicates from Sorted List
- 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
- 打击侵犯公民个人信息罪的司法困境
- VFP访问外部数据源的几种方法
- http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9332 多broser
- Effective C++ -----条款05:了解C++默默编写并调用哪些函数
- mysql 查询缓存及设置
- 黑猫论坛实战免杀教程
- 苹果ipad8和ipad9的区别
- 【渝粤教育】国家开放大学2018年春季 8639-21T食品营养与健康 参考试题
- 开机自动随机改计算机名,【优化电脑·禁止随机启动项·加速开机】
- 超级硬干货| 电脑蓝屏代码大全及解决办法合集
- Python基础——修改Python字典中的key(键)
- Arcpy基础入门-2、arcpy的批处理功能
- i5 13600K和i5 12600k差距
- 泛型的基础概念,T和?的使用方法和区别
- python中用什么函数读取字符串_Python(2)字符串的主要方法
- python 人生的第一个小爬虫 爬小说 保存一下