在tomcat下执行class文件的异常
下面这段代码是用来编译执行一个已经存在的java文件的,这个工程用myeclipse可以正常编译执行,没有异常,但是把工程发布到tomcat下,运行tomcat后,在StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);这一行报空指针异常,请各位帮忙看一下,什么原因
再说明一下:我的工程发布到tomcat后,在myeclipse下启动tomcat服务器,能够正确执行工程文件;但是,如果直接启动tomcat时,在执行到上面的那段代码时就会报空指针异常。
在myeclipse下启动tomcat与直接启动tomcat,对发布的工程的执行有什么区别吗?
Java代码
// 编译生成的java文件
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// ��bDiagnosticCollector����
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler
.getStandardFileManager(diagnostics, null, null);
// String realPath1 = System.getProperty("user.dir");
/*
* System.setProperty("user.dir",
* "D:/Administrator/workspace/msmart"); String realPath =
* System.getProperty("user.dir");
*
* Iterable<String> options = Arrays.asList("-encoding",
* "UTF-8", "-d", realPath + "/WebRoot/WEB-INF/classes", "-cp",
* realPath + "/WebRoot/WEB-INF/lib/msmart.jar");
*
* String[] sd = new String[1]; sd[0] = realPath +
* "/src/com/msmart/servlet/Model" + id + ".java";
*/
// System.setProperty("user.dir",
// "D:/Administrator/workspace/msmart");
String path1 = request.getSession().getServletContext()
.getRealPath("/");
String realPath = System.getProperty("user.dir");
System.out.println("CCC" + path1);
System.out.println("BBB" + realPath);
Iterable<String> options = Arrays.asList("-encoding", "UTF-8",
"-d", path1 + "/WEB-INF/classes", "-cp", path1
+ "/WEB-INF/classes");
String[] sd = new String[1];
sd[0] = path1 + "/WEB-INF/classes/com/msmart/servlet/Model"
+ id + ".java";
Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjectsFromStrings(Arrays.asList(sd));
JavaCompiler.CompilationTask task = compiler.getTask(null,
fileManager, diagnostics, options, null,
compilationUnits);
// ����Դ����
boolean success = task.call();
fileManager.close();
System.out.println((success) ? "����ɹ�" : "����ʧ��");
for (Diagnostic<?> diagnostic : diagnostics.getDiagnostics())
System.out
.printf("Code: %s%n" + "Kind: %s%n"
+ "Position: %s%n" + "Start Position: %s%n"
+ "End Position: %s%n" + "Source: %s%n"
+ "Message: %s%n", diagnostic.getCode(),
diagnostic.getKind(), diagnostic
.getPosition(), diagnostic
.getStartPosition(), diagnostic
.getEndPosition(), diagnostic
.getSource(), diagnostic
.getMessage(null));
再说明一下:我的工程发布到tomcat后,在myeclipse下启动tomcat服务器,能够正确执行工程文件;但是,如果直接启动tomcat时,在执行到上面的那段代码时就会报空指针异常。
在myeclipse下启动tomcat与直接启动tomcat,对发布的工程的执行有什么区别吗?
Java代码
// 编译生成的java文件
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// ��bDiagnosticCollector����
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler
.getStandardFileManager(diagnostics, null, null);
// String realPath1 = System.getProperty("user.dir");
/*
* System.setProperty("user.dir",
* "D:/Administrator/workspace/msmart"); String realPath =
* System.getProperty("user.dir");
*
* Iterable<String> options = Arrays.asList("-encoding",
* "UTF-8", "-d", realPath + "/WebRoot/WEB-INF/classes", "-cp",
* realPath + "/WebRoot/WEB-INF/lib/msmart.jar");
*
* String[] sd = new String[1]; sd[0] = realPath +
* "/src/com/msmart/servlet/Model" + id + ".java";
*/
// System.setProperty("user.dir",
// "D:/Administrator/workspace/msmart");
String path1 = request.getSession().getServletContext()
.getRealPath("/");
String realPath = System.getProperty("user.dir");
System.out.println("CCC" + path1);
System.out.println("BBB" + realPath);
Iterable<String> options = Arrays.asList("-encoding", "UTF-8",
"-d", path1 + "/WEB-INF/classes", "-cp", path1
+ "/WEB-INF/classes");
String[] sd = new String[1];
sd[0] = path1 + "/WEB-INF/classes/com/msmart/servlet/Model"
+ id + ".java";
Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjectsFromStrings(Arrays.asList(sd));
JavaCompiler.CompilationTask task = compiler.getTask(null,
fileManager, diagnostics, options, null,
compilationUnits);
// ����Դ����
boolean success = task.call();
fileManager.close();
System.out.println((success) ? "����ɹ�" : "����ʧ��");
for (Diagnostic<?> diagnostic : diagnostics.getDiagnostics())
System.out
.printf("Code: %s%n" + "Kind: %s%n"
+ "Position: %s%n" + "Start Position: %s%n"
+ "End Position: %s%n" + "Source: %s%n"
+ "Message: %s%n", diagnostic.getCode(),
diagnostic.getKind(), diagnostic
.getPosition(), diagnostic
.getStartPosition(), diagnostic
.getEndPosition(), diagnostic
.getSource(), diagnostic
.getMessage(null));
...全文
相关推荐
Tomcat报错:HTTP Status 500 (Wrapper cannot find servlet class)解决办法
清空项目,并执行clean project操作,以确保所有的旧文件被清理,并触发重新编译。 b.
tomcat报错:Wrapper cannot find servlet class ...问题解决
如果找不到对应的类,就会抛出“Wrapper cannot find servlet class”异常。错误信息中提到的“xxx”就是你定义的Servlet类名。问题分析:1.
tomcat6异常问题
但考虑到有些用户可能仍在使用Tomcat 6.0,我们将探讨如何解决其中的jar包问题。jar(Java Archive)文件是Java平台上的一个可执行文件格式,用于打包和分发Java类库。
tomcat 定时作业
- 错误处理:为可能出现的异常做好处理,避免定时任务因错误而停止。总结,Tomcat作为定时器是一个实用的功能,尤其对于那些不需要额外部署调度服务的轻量级应用。
tomcat源码资源包
**Jasper**:Tomcat的JSP编译器,负责将JSP文件转换为Java Servlet源代码,然后编译成.class文件供Tomcat执行。4.


Web 开发
