`
dalongxn
  • 浏览: 31560 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

通过Runtime调用dos命令实现java动态编译

    博客分类:
  • java
阅读更多

最近项目需要实现自定义生成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

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java实现控制dos清屏cls

    在Java中,我们通常不能直接调用DOS的cls命令,但可以通过一些技巧来实现类似的效果。 标题"java实现控制dos清屏cls"所指的是如何在Java程序中模拟DOS的清屏操作。这里提供了一种解决方案,包括两个关键文件:CLS....

    java在dos控制台下的一个清屏的Demo

    在这个Java Demo中,我们将探讨如何通过调用DOS命令来达到清屏的效果。 首先,`cls`是DOS中的一个命令,全称为“clear screen”,它的作用就是清理当前屏幕的所有内容,将光标移动到屏幕的左上角。在Java程序中,...

    java基础知识总结

    编写Java程序需要使用文本编辑器(如记事本)创建一个.java源文件,然后通过javac命令编译它生成.class字节码文件。最后,通过java命令运行字节码文件,看到输出结果。这个过程体现了Java程序的开发运行流程:编写、...

    Java基础语法.pdf

    在命令行窗口中,可以使用javac命令编译Java源文件,生成class文件,再使用java命令运行class文件。 HelloWorld案例作为Java编程入门的经典案例,展示了Java程序开发的基本流程。这个案例演示了如何在屏幕上打印...

    毕老师java基础笔记总结

    - **常见DOS命令**: - `dir`:显示当前目录下的所有文件和文件夹。 - `md <dirname>`:创建新的目录。 - `rd <dirname>`:删除目录。 - `cd <dirname>`:进入指定目录。 - `cd ..`:返回上级目录。 - `cd /`...

    Java基础系列

    ### Java基础系列:JavaSE基础知识 流程语句 #### 一、JavaSE-01-基础入门 ...以上内容概括了JavaSE基础知识的主要方面,从DOS命令到Java语言特性,再到具体的编程实践,涵盖了初学者入门Java所需的基本技能和概念。

    java基础文档

    课后作业通常包括下载并安装JDK,学习DOS命令,以及通过实践加深对课堂内容的理解。 在编程实践中,遵循良好的命名规范,如类名首字母大写,使用名词性词组,是提高代码可读性和维护性的关键。此外,理解访问修饰符...

    java实训笔记

    - `javac`命令用于编译Java源代码,生成`.class`字节码文件。 - `java`命令用于运行已编译的Java程序。 - 使用文本编辑器如EditPlus,可以配置快捷键或工具来自动化编译和运行过程。 4. **数据类型与运算**: -...

    Java程序设计(新) 学生实训任务单.doc

    6. **验证安装与环境配置**:通过在DOS窗口中输入`javac`和`java`命令,检查是否能正确显示相关信息,这可以验证JDK的安装和环境变量配置是否成功。 评分标准反映了实训过程中的重点,JDK的安装和环境配置占据了大...

    java基础——入门篇

    介绍图形化界面(GUI)和DOS命令行交互,包括如何打开命令行(如Win+R调用运行对话框输入cmd),以及常用的DOS命令,如dir、md、rd、cd、echo、type、del、exit、cls等。 通过学习这个入门篇,初学者将能够理解...

    Java入门教程

    JAVA_HOME应设置为JDK的安装路径,PATH中应包含JDK的bin目录,这样在DOS命令行中可以直接调用Java相关命令。CLASSPATH在JDK 5.0之后通常不需要手动配置,因为Java能自动搜索类文件。 编写Java程序分为三个步骤:...

    matlab消除dos窗口

    MATLAB的编译器(MCR,MATLAB Compiler Runtime)默认会生成带命令行窗口的可执行文件,这是因为MATLAB程序在运行时需要与操作系统进行交互,而DOS窗口就是这种交互的体现。但通过一些设置,我们可以控制这个行为。 ...

    jdk安装与配置教程

    JDK 中包括了 JRE(Java Runtime Environment,Java 运行环境),用来运行 Java 程序的。JRE 只要安装在机器上,即可运行 Java 程序,实现了所谓的跨平台。 JDK 中的几个概念 * `javac.exe` 是 Java 语言的编译器...

    C#调用C语言DLL文件示范

    - **OutDir_To_Txt**: 该函数使用 `system` 函数执行DOS命令将当前目录下的文件列表写入名为 `Dir.txt` 的文件中。 - **DllMain**: 这是每个DLL文件都必须有的入口点函数,它处理DLL加载过程中的各种事件。 #### ...

    Java基础入门.md

    - **实现方式**:通过在不同平台上安装对应版本的Java虚拟机(JVM, Java Virtual Machine)来实现跨平台性。 - **JVM作用**:解释并执行Java字节码,使得Java程序能够在多种平台上运行而无需修改代码本身。 ##### ...

    Java基础知识点总结

    - **跨平台性**:Java程序可以在任何支持Java的平台上运行,这是通过Java虚拟机(JVM)实现的。Java编译器将源代码编译成字节码,JVM负责解释并执行这些字节码。 - **平台**:Java平台主要分为三个部分:Java SE...

    C#操作DOS右键快捷通道,完整项目+源代码

    3. **ShellExecute API调用**:当用户点击自定义的右键菜单项时,需要调用Windows API中的`ShellExecute`函数来执行对应的DOS命令。C#中可以使用`DllImport`特性导入这个API,然后在需要的地方调用。 4. **源代码...

    java基础知识点.pdf

    - **JRE (Java Runtime Environment)**:Java运行时环境,提供了运行已编译Java程序所需的环境。 5. **环境变量配置** - **Path**:用于指定系统在搜索可执行文件时会查看的路径。不同路径之间使用`;`分隔。 - *...

    Java程序设计(新) 教师实训任务单.doc

    通过在DOS窗口输入`javac`和`java`命令,观察返回的提示信息,确认JDK安装和环境变量配置是否成功。如果能正确显示版本信息,说明安装配置无误。 **JRE的区别** JRE(Java Runtime Environment)是Java程序运行所需...

    JAVA基础面试题(经典).doc

    JRE是Java Runtime Environment,Java运行时环境,它包含了运行Java程序所需的Java虚拟机(JVM)、类库和其他组件。 2. **Java的平台无关性** Java的平台无关性源于其“一次编写,到处运行”的理念。Java源代码会...

Global site tag (gtag.js) - Google Analytics