|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
- 发信人: rehte (Ava), 信区: Java
- 标 题: Re: 哪位大侠帮忙看看~
- 发信站: BBS 水木清华站 (Mon Nov 18 14:48:26 2002), 转信
- 我已经试过了,问题出在ComplingClassLoader的compile函数中的
- Runtime.getRuntime().exec("javac "+javaFile);一句。
- 由于这样运行javac命令是不带任何环境参数的,包括path和classpath
- ,因此你在系统环境中设置的path,classpath全部不起作用了。因此
- 着个代码运行的结果是
- 'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 你的程序运行时没有报这个错误是因为exec不给被执行程序输出控制
- 台(output console),因此实际上exec执行失败,class文件并没有生成,
- 它的返回值ret=1,因此也就会ClassNotFoundException
- 解决办法
- 1.使用exec(String []cmdarray,String[]envp)将环境参数path,classpath
- 通过envp传入。
- 或者
- 2.使用sun.tools.javac.Main类编译java源文件,sun.tools.javac.Main属于
- 核心包的实现库(基础库),可以,import进后同核心类一样使用。
- 下面是一个例子(摘自tomcat源代码)
- public boolean compile(String source) {
- Main compiler = new Main(out, "jsp->javac");
- String[] args = new String[]
- {
- "-encoding", encoding,
- "-classpath", classpath,
- "-d", outdir,
- source
- };
- return compiler.compile(args);
- }
- 【 在 marlborowang (Marlboro) 的大作中提到: 】
- : import java.io.*;
- : public class CompilingClassLoader extends ClassLoader
- : {
- : private byte[] getBytes( String filename ) throws IOException
- : {
- : System.out.println( "begin to load the getBytes method~~~~" );
- : File file = new File( filename );
- : long len = file.length();
- : System.out.println("file = "+file);
- : System.out.println("len = "+len);
- : byte raw[] = new byte[(int)len];
- : ...................
复制代码 |
|