`
yuancihang
  • 浏览: 142614 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

Java编程编译源代码

阅读更多

1.环境

JDK6

 

2.代码



import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import com.yuan.common.file.DefaultFilenameFilter;

public class CompileUtil {

    private static String JAVA_SOURCE_FILE = "d:/DynamicObject.java";
    private static String JAVA_CLASS_NAME = "DynamicObject";
    private static List<File> sourceList = new ArrayList<File>(); //源文件列表
    private static final String BASEPATH = "d:/tmp";
   
   
    public static synchronized void defaultCompile(String basePath)throws Exception{
        File f = new File(basePath);
        String sourcePath = f.getAbsolutePath()+File.separator+"src";
        String targetPath = f.getAbsolutePath()+File.separator+"bin";
        String libPath = f.getAbsolutePath()+File.separator+"lib";
        compilePackage(sourcePath,targetPath,libPath);
    }
   

    /**
     * 编译包及其子包
     * @param sourcePath String
     * @param targetPath String 编译后的类文件的输出文件夹
     * @param libPath String 放置第三方类库的文件夹
     * @throws Exception
     */
    public static synchronized  void compilePackage(String sourcePath , String targetPath , String libPath)throws Exception{
        sourceList.clear();
        compileSourceFile(getSourceList(sourcePath),targetPath,libPath);
    }
   
    private static List<File> getSourceList(String dirPath)throws Exception{
       
        File dir = new File(dirPath);
        File[] files = dir.listFiles(new DefaultFilenameFilter("java"));
        for(File f:files){
            if(f.isDirectory()){//如果是文件夹则迭代
                getSourceList(dirPath+File.separator+f.getName());
            }else{
                sourceList.add(f);
            }
        }
        return sourceList;
    }
   
    /**
     * 编译单个Java源文件
     * @param fileName String
     * @param targetPath String
     * @param libPath String
     */
    public static void compileSourceFile(final String fileName , String targetPath , String libPath){
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        try {
            Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(fileName);
            compiler.getTask(null, fileManager, null, getCompileOptions(targetPath,libPath), null, sourcefiles).call();
            fileManager.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    /**
     * @param files List<File>
     * @param targetPath String 目标文件夹
     * @param libPath String 放置第三方类库的文件夹
     */
    private static void compileSourceFile(List<File> files , String targetPath , String libPath){
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        try {
            Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjectsFromFiles(files);
            compiler.getTask(null, fileManager, null, getCompileOptions(targetPath,libPath), null, sourcefiles).call();
            fileManager.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
   
    /**
     * 设置编译选项
     * @param targetPath String
     * @param libPath String
     * @return
     */
    private static Iterable<String> getCompileOptions(String targetPath , String libPath){
        List<String> options = new ArrayList<String>();
       
        //设置编译后生成的类文件的输出目录
        if(targetPath != null){
            options.add("-d");
            options.add(targetPath);
        }
       
        //设置用到的第三方类库的目录
        if(libPath != null){
            options.add("-classpath");
            options.add(getLibStr(libPath));
        }
        return options;
    }
   
    private static String getLibStr(String libPath){
        StringBuffer sb = new StringBuffer();
        File libDir = new File(libPath);
        File[] jarFiles = libDir.listFiles(new DefaultFilenameFilter("jar"));
        for(File f:jarFiles){
            if(!f.isDirectory()){
                sb.append(libPath+File.separator+f.getName()+";"); //多个jar文件用分号隔开
            }
        }
        return sb.substring(0, sb.lastIndexOf(";"));
    }
   
   

}



import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

import com.yuan.common.util.AssertUtil;

public class DefaultFilenameFilter implements FilenameFilter {
   
    private boolean ignoreDir = false; //是否忽略文件夹,默认不忽略
    private List<String> extList = new ArrayList<String>();
   
    public DefaultFilenameFilter(final String ext){
        this.extList.add("."+ext);
    }
    public DefaultFilenameFilter(final String... exts){
        if((exts != null) && (exts.length > 0)){
            for(String ext : exts){
                this.extList.add("."+ext);
            }
        }
       
    }
   
    public DefaultFilenameFilter(final String ext, boolean ignoreDir){
        this.ignoreDir = ignoreDir;
        this.extList.add("."+ext);
    }
   
    public void addExt(final String ext){
        this.extList.add("."+ext);
    }
   
    public boolean accept(File dir, String name) {
        if(ignoreDir){
            if(new File(dir+File.separator+name).isDirectory()){
                return false;
            }else{
                return endsWithExt(name);
            }
        }else{
            return endsWithExt(name)||new File(dir+File.separator+name).isDirectory();
        }//if
    }//accept
   
    protected boolean endsWithExt(String name){
        if(!AssertUtil.notEmpty(extList)){
            return true;
        }
        for(String ext : extList){
            if(name.endsWith(ext)){
                return true;
            }
        }
       
        return false;
    }

}


import java.util.Collection;
import java.util.Map;

public class AssertUtil {
   
    public static boolean notEmpty(Object[] array) {
        return (array != null) && (array.length > 0);
    }
   
    public static boolean notEmpty(Collection<?> collection) {
        return (collection != null) && (!collection.isEmpty());
    }
   
    public static boolean notEmpty(Map<?,?> map) {
        return (map != null) && (!map.isEmpty());
    }
   
    public static void main(String args[]){
       
    }

}

3. 测试

 

public static void main(String[] args) throws Exception{
       
        defaultCompile("d:/tmp");

       compilePackage("d:/tmp/src", "d:/tmp/bin","d:/tmp/lib");
    }// main

分享到:
评论
1 楼 sp42 2015-08-09  
学习了 谢谢

相关推荐

    Java动态编译Java代码,运行在内存中,并执行

    添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...

    JAVA加密 保护源代码 防止反编译的工具

    而且大多数不是很好用,这样自己辛苦开发出来的程序很容易被人反编译过来而据为己有,一般情况下,大多数的人都是用混编器(java obfuscator)来把开发出来的程序进行打乱以达到没有办法来反编译观看源代码,...

    小颖JAVA源代码反编译工具_1.3.0.0

    Java,Java反编译工具,小颖JAVA源代码反编译工具_1.3.0.0

    XJad-Java源代码反编译工具

    XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2。  XJad可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件。  XJad带有多页面文本编辑器,反编译完成后可以直接编辑查看,...

    《java 数据库编程实例》 源代码

    有《Java数据库编程实例》一书中的所有实例源程序代码,编译通过的实例类代码和JBuilder工程文件,以及实例中应用的数据库,并有在实例中涉及的相关Java类文件(数据库驱动程序)。

    五子棋 java源程序 编译好的

    关于五子棋的一个小游戏,其中有源代码 有编译文件 可以直接运行

    编译原理上的java版C编译器源代码.rar

    这是C语言编译器的源代码,供网友学习C语言编译器使用。源代码对C语言的基本架构做了具体的实现,而且代码非常精简,只保留了最基本的部分。

    Java源代码反编译工具

    XJad(Java源代码反编译工具) V2.2 XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2。 XJad可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件。 XJad带有多页面文本编辑器...

    JAVA单机游戏源代码

    很好玩的一个小游戏,编译完全通过,在java环境中运行,比较适合初学者,但也要一定基础才能看懂

    java 计算器小程序代码

    java 计算器小程序代码,可以直接编译运行的

    java版飞鸽源代码

    java版飞鸽源代码,包括编译号的程序!

    DJ Java Decompiler 3.12.12.96 老朽痴拙汉化版(JAVA反编译)

    DJ可以从已经编译的二进制class文件重新创建最初的源代码(比如说Java applets)。 DJ可以反编译复杂的Java applets和二进制文件,产生准确的源代码。 DJ是一个标准的Windows应用程序;它甚至不需要你的机器上安装...

    反编译Java程序

    本书是www.bocaitong3.com一本专为已经具备Java程序语言基础的读者...帮助读者彻底了解Java Applet的设计方法,并结合源代码展示、解释,轻松地掌握Java Applet程序在网络上的运用,能让你拥有更丰富的设计经验与技巧。

    Java数据库编程实例源程序代码

    该文档中有《Java数据库编程实例》一书中的所有实例源程序代码,编译通过的实例类代码 和JBuilder工程文件,以及实例中应用的数据库,并有在实例中涉及的相关Java类文件(数据库 驱动程序)。

    java反编译工具.zip

    总之,Java反编译工具是Java开发人员不可或缺的工具之一,在需要查看第三方库或系统源代码、调试应用程序或检测恶意软件时提供帮助。以上介绍的工具是一些常用的Java反编译工具,具体使用需要根据实际情况来选择。

    Java编程达人分享:中国象棋游戏源代码.rar

    Java编程达人分享:中国象棋游戏源代码,看看界面,是不是相当不错,作者:yaoyun,CSDN达人写的Java象棋游戏,编译环境:JDK1.7 Eclipse3.7 呵呵,可能比较老的环境了。  注:程序中用到了一个字体太大了,删除了...

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...

    QQAndroid版本反编译源代码

    (1)反编译QQ Android版本源代码(java),仅供学习、研究使用,不得用于商业用途。 (2)反编译的应用程序清单文件(AndroidManifest.xml.txt)。

    基于微信小程序购物商城app设计带Java后端+源代码+文档说明+数据库.zip

    基于微信小程序购物商城app设计带Java后端+源代码+文档说明+数据库.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用...

    JAVA EE源代码

    JAVA EE源代码 是反编译过的,有兴趣的可以看看

Global site tag (gtag.js) - Google Analytics