急!!!关于Javac和Java命令,在程序代码中调用该命令编译和运行任意位置的文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!!!关于Javac和Java命令,在程序代码中调用该命令编译和运行任意位置的文件相关的知识,希望对你有一定的参考价值。
在D:/test/下有一个类test.java,代码如下:
public class test
public static void main(String[] args)
System.out.println("JavaCompiler测试成功!");
然后在test下还有一个类test_compilerapi.java,代码如下:
import java.io.*;
import javax.tools.*;
public class test_compilerapi
public OutputStream go(OutputStream out) throws IOException
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int results = compiler.run(null, null, out, "D:/test/test.java");
System.out.println((results == 0) ? "编译成功" : "编译失败");
// 在程序中运行test
Runtime run = Runtime.getRuntime();
Process p = run.exec("java test");
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s;
while ((s = br.readLine()) != null)
System.out.println(s);
return out;
public static void main(String args[]) throws IOException
File f1 = new File("demo1.txt");
try
OutputStream ss=new BufferedOutputStream(new FileOutputStream(f1));
ss=new test_compilerapi().go(ss);
ss.write(ss.toString().length());
ss.close();
catch(Exception e)
如果我在D:/test下用DOS编译和运行test_compilerapi.java,可以在窗口中得到test.java的运行结果,当我把JDK的ClassPath值设置为:.;d:\test\后,在任意位置使用DOS运行test_compilerapi.java也可以得到,问题:
1.如果我为test.java加上包名,则不能得到运行结果。
2.将test_compilerapi.java复制到Eclipse的一个项目中,当然这个项目的存放目录不是D:/test,那么即使ClassPath设置成上述值,仍然不能得到test.java的运行结果,这是为什么?在Eclipse中运行和在电脑的任意位置用DOS运行有什么不同?
急!敬请指教,如果可以,一定多给分!
不说包名的问题了,所有的源文件都没有包名。现在的问题是:将test_compilerapi.java复制到Eclipse的一个项目中,当然这个项目的存放目录不是D:/test,而且ClassPath设置成上述值,已经可以得到test.java的运行结果了,但是当我把test_compilerapi.java(它是含有main函数的)中的代码几乎原封不动的复制到一个Struts+Hibernate的项目中的Action类中时,就不行 了,又得不到结果了。见鬼了。
一:把包去掉
二:运行时候加上这个
java wo/Helloworld1
为什么会出现这样的原因呢?
因为打包的时候已经把.class文件打包到wo的文件夹下去了
而java命令执行的时候是在当前目录下找.class文件,如果找不到就会出错
所以。。。。。
呵呵
给你做个示范
C:\>javac -d . Helloworld1.java //打包
C:\>java Helloworld1
Exception in thread "main" java.lang.NoClassDefFoundError: Helloworld1 (wrong na
me: wo/Helloworld1)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Helloworld1. Program will exit.
成功后的是这样的:
C:\>java wo/Helloworld1
Hello world!
讲的不是很多,但原理就这样的哦 参考技术A 有了包名的话就得
java 报名.test才能执行啊。否者找不到类。你的第二个问题也是这个。加上包名试试 参考技术B can kao: http://hi.baidu.com/christal_yhy/blog/item/965d28a3c69da4a4caefd03b.html 参考技术C Process p = run.exec("java test");
这里 可以改成 run.bat
run.bat中内容为
cd 目录
java test
直接java class文件应该是可以的
前面加上路径肯能会有问题
以上是关于急!!!关于Javac和Java命令,在程序代码中调用该命令编译和运行任意位置的文件的主要内容,如果未能解决你的问题,请参考以下文章