一、编译部分
- public void complier() throws IOException {
- System.out.println("*** --> 开始编译java源代码...");
- File javaclassDir = new File(javaClassPath);
- if (!javaclassDir.exists()) {
- javaclassDir.mkdirs();
- }
- List<String> javaSourceList = new ArrayList<String>();
- getFileList(new File(javaSourcePath), javaSourceList);
- JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
- int result = -1;
- for (int i = 0; i < javaSourceList.size(); i++) {
- result = javaCompiler.run(null, null, null, "-d", javaClassPath, javaSourceList.get(i));
- System.out.println(result == 0 ? "*** 编译成功 : " + javaSourceList.get(i) : "### 编译失败 : " + javaSourceList.get(i));
- }
- System.out.println("*** --> java源代码编译完成。");
- }
- private void getFileList(File file, List<String> fileList) throws IOException {
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- for (int i = 0; i < files.length; i++) {
- if (files[i].isDirectory()) {
- getFileList(files[i], fileList);
- } else {
- fileList.add(files[i].getPath());
- }
- }
- }
- }
二、打包部分
- public void generateJar() throws FileNotFoundException, IOException {
- System.out.println("*** --> 开始生成jar包...");
- String targetDirPath = targetPath.substring(0, targetPath.lastIndexOf("/"));
- File targetDir = new File(targetDirPath);
- if (!targetDir.exists()) {
- targetDir.mkdirs();
- }
- Manifest manifest = new Manifest();
- manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
- JarOutputStream target = new JarOutputStream(new FileOutputStream(targetPath), manifest);
- writeClassFile(new File(javaClassPath), target);
- target.close();
- System.out.println("*** --> jar包生成完毕。");
- }
- private void writeClassFile(File source, JarOutputStream target) throws IOException {
- BufferedInputStream in = null;
- try {
- if (source.isDirectory()) {
- String name = source.getPath().replace("\\", "/");
- if (!name.isEmpty()) {
- if (!name.endsWith("/")) {
- name += "/";
- }
- name = name.substring(javaClassPath.length());
- JarEntry entry = new JarEntry(name);
- entry.setTime(source.lastModified());
- target.putNextEntry(entry);
- target.closeEntry();
- }
- for (File nestedFile : source.listFiles())
- writeClassFile(nestedFile, target);
- return;
- }
- String middleName = source.getPath().replace("\\", "/").substring(javaClassPath.length());
- JarEntry entry = new JarEntry(middleName);
- entry.setTime(source.lastModified());
- target.putNextEntry(entry);
- in = new BufferedInputStream(new FileInputStream(source));
- byte[] buffer = new byte[1024];
- while (true) {
- int count = in.read(buffer);
- if (count == -1)
- break;
- target.write(buffer, 0, count);
- }
- target.closeEntry();
- } finally {
- if (in != null)
- in.close();
- }
- }
三、使用
- public static void main(String[] args) throws IOException, InterruptedException {
- String currentDir = "c:/myProject";
- String javaSourcePath = currentDir + "/src/main/java/";
- String javaClassPath = currentDir + "/classes";
- String targetPath = currentDir + "/target/MyProject.jar";
- CompilerAndJarTools cl = new CompilerAndJarTools(javaSourcePath, javaClassPath, targetPath);
- cl.complier();
- cl.generateJar();
- }