最近项目需要实现自定义生成java类与jsp页面,网上搜索很多资料对java类编译这块大多数使用jdk1.6的新特性compiler API进行编译,最后因为服务器环境为weblogic10.0无法使用jdk1.6,而放弃使用,改成使用调用dos命令的方法,在此总结一下,便于以后查阅。
一,路径
1.获取服务器路径
String filePath= Thread.currentThread().getContextClassLoader()
.getResource("").getPath();
filePath= filePath.split("classes")[0];
filePath= filePath.replaceAll("%20", " ");
2.类存放路径
String fileName = filePath+"classes/com/vingsoft/res/entity/TEST.java";
二,java类拼接
String source = "package com.vingsoft.res.entity;" + rt // +"import java.util.Date;"+rt + "import javax.persistence.Column;" + rt + "import javax.persistence.Entity;" + rt + "import javax.persistence.GeneratedValue;" + rt + "import javax.persistence.GenerationType;" + rt + "import javax.persistence.Id;" + rt + "import javax.persistence.SequenceGenerator;" + rt + "import javax.persistence.Table;" + rt // 导入需要的架包 + "public class TEST" + rt + "{" + rt + "private Long uuid;"+ rt + "public Long getUuid() {" + rt + "return uuid;" + rt + "}" + rt + "public void setUuid(Long uuid) {" + rt + "this.uuid = uuid;" + rt + "}" + rt; //... 省略其他动态生成 source += "}";
三,流输入文件(UTF-8格式,防止乱码)
/**
* 创建UTF格式文件 * * @author 大龙 * @date 2012-11-1 下午05:35:22 * @param fileName生成文件路径 * @param source * 文件内容 * @return */ public static boolean writeUTFFile(String fileName, String source) { boolean bool = false; FileOutputStream fos = null; OutputStreamWriter osw = null; try { fos = new FileOutputStream(fileName); osw = new OutputStreamWriter(fos, "UTF-8"); osw.write(source); bool = true; } catch (Exception e) { e.printStackTrace(); bool = false; } finally { if (osw != null) { try { osw.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return bool; }
四,编译java类
1.String cp为类中需要调用的jar包路径,引用的class文件直接引用到classes即可
2.getSystemByFile方法是配置了system.properties属性,因为在linux系统下;要换成:
/** * 编译java类 * * @author 大龙 * @date 2012-11-1 下午05:45:56 * @param filePath * D:/develop/tomcat/webapps/com/WEB-INF * @param fileName */ public static boolean toCreateClass(String filePath, String fileName) { // 得到写文件路径 // filePath = "D:/develop/tomcat/webapps/com/WEB-INF"; // fileName = "/controller/T_CATA_CEController"; String path = filePath + "lib";// 架包路径 String classPath = filePath + "classes";// 编译类路径 try { Runtime rt = Runtime.getRuntime(); rt.exec("javac -cp "+getSystemByFile(path,classPath)+" "+filePath + fileName); return true; } catch (Throwable t) { t.printStackTrace(); return false; } } /** * 获取系统环境 * @author 大龙 * @date 2012-11-21 上午09:34:08 * @param path * @param classPath * @return */ private static String getSystemByFile(String path,String classPath){ String cp=path + "/spring-beans-3.0.5.RELEASE.jar;" + path + "/spring-jdbc-3.0.5.RELEASE.jar;" + path + "/spring-context-3.0.5.RELEASE.jar;" + path + "/iframework-1.0.6.jar;" + path + "/spring-tx-3.0.5.RELEASE.jar;" + path + "/hibernate-jpa-2.0-api-1.0.0.Final.jar;" + path + "/hibernate-core-3.6.1.Final.jar;" // controller + path + "/servlet-api-2.3.jar;" + path + "/spring-web-3.0.5.RELEASE.jar;" + path + "/iframework-1.0.6.jar;" + path + "/commons-lang-2.6.jar;" // classes类 + classPath // 引入的类文件 ; Properties prop = new Properties(); try { InputStream in = new BufferedInputStream(new FileInputStream(classPath+"/system.properties")); prop.load(in); String sys=prop.getProperty("system").trim(); if(sys.equals("linux")){ cp=cp.replaceAll(";", ":"); } } catch (IOException e) { e.printStackTrace(); } System.out.println("引用包:"+cp); return cp; }
大龙
2012/11/21