Java_JAVA6动态编译的问题
摘自:http://www.iteye.com/problems/14909
在使用JAVA6动态编译时遇到的一个问题,动态编译方法已经写就。通过main方法调用的动态编译时,编译通过,并可以使用编译生成的类。但是,在Tomcat下调用同样的方法进行动态编译时,编译无法通过。其原因是找不到对应的包。因为动态生成的类中import了其他的一些类。我猜是tomcat的某些加载机制影响了动态编译过程,导致动态编译找不引用的类。请问各位,是否有方法解决?
问题补充:
补充代码:
参数 files是一个JavaFile类型的数组,其中包含了Java类的源文件
- public static Class[] complie(JavaFile[] files) throws Exception
- {
- JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
- //ClassLoader clsLoader=ToolProvider.getSystemToolClassLoader();
- DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
- MemoryFileManager filemanage = new MemoryFileManager(compiler
- .getStandardFileManager(diagnostics, null, null));
- //MemoryFileManager filemanage = new MemoryFileManager(compiler
- //.getStandardFileManager(diagnostics, null, null));
- //Log.info("Location\t"+filemanage.)
- ArrayList<JavaFileObject> clsFiles=new ArrayList<JavaFileObject>();
- for(JavaFile file:files)
- {
- JavaFileObject clsfile = MemoryFileManager.makeSource(file
- .getFileName(), file.toString());
- clsFiles.add(clsfile);
- Log.info("compile:"+file.getFileName()+"\t"+clsfile.getName()+"\t"+clsfile.getKind()+"\t"+clsfile.toUri());
- }
- Iterable<? extends JavaFileObject> compilationUnits=clsFiles;
- JavaCompiler.CompilationTask task = compiler.getTask(null, filemanage,
- diagnostics, null, options.getClassNames(), compilationUnits);
- boolean success=false;
- try
- {
- success = task.call();
- } catch (Exception e)
- {
- e.printStackTrace();
- }
- Class[] clazz=new Class[files.length];
- if(success)
- {
- for(int i=0;i<clazz.length;i++)
- {
- clazz[i] = filemanage.getClassLoader(null).loadClass(files[i].getFileName());
- }
- }
- else
- {
- 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));
- }
- filemanage.close();
- return clazz;
- }
问题补充:
TOMCAT下的编译诊断信息:
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 0
- Start Position: 0
- End Position: 0
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:1: 软件包 com.youngor.dboperator 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 104
- Start Position: 78
- End Position: 112
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:4: 软件包 com.youngor.webcore.entity 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 146
- Start Position: 124
- End Position: 156
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:6: 软件包 com.youngor.dboperator 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 202
- Start Position: 180
- End Position: 212
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:9: 软件包 com.youngor.dboperator 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 239
- Start Position: 213
- End Position: 251
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:9: 软件包 com.youngor.webcore.entity 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 0
- Start Position: 0
- End Position: 0
- Source: mfm:///RuntimeEntitySysPosition.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysPosition.java:1: 软件包 com.youngor.dboperator 不存在
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 108
- Start Position: 82
- End Position: 120
- Source: mfm:///RuntimeEntitySysPosition.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysPosition.java:4: 软件包 com.youngor.webcore.entity 不存在
- Code: compiler.err.cant.resolve.location
- Kind: ERROR
- Position: 328
- Start Position: 328
- End Position: 337
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:14: 找不到符号
- 符号: 类 EntitySet
- 位置: 类 RuntimeEntitySysUser
- Code: compiler.err.cant.resolve.location
- Kind: ERROR
- Position: 383
- Start Position: 383
- End Position: 392
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:14: 找不到符号
- 符号: 变量 DefaultDB
- 位置: 类 RuntimeEntitySysUser
- Code: compiler.err.doesnt.exist
- Kind: ERROR
- Position: 436
- Start Position: 410
- End Position: 448
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:14: 软件包 com.youngor.webcore.entity 不存在
- Code: compiler.err.cant.resolve.location
- Kind: ERROR
- Position: 619
- Start Position: 619
- End Position: -1
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:16: 找不到符号
- 符号: 变量 super
- 位置: 类 RuntimeEntitySysUser
- Code: compiler.err.cant.resolve.location
- Kind: ERROR
- Position: 667
- Start Position: 667
- End Position: -1
- Source: mfm:///RuntimeEntitySysUser.java from JavaSourceFromString
- Message: mfm:///RuntimeEntitySysUser.java:18: 找不到符号
- 符号: 变量 super
- 位置: 类 RuntimeEntitySysUser
Tomcat输出的异常信息:
- java.lang.NullPointerException
- at com.youngor.dboperator.EntityUtil.getInstance(EntityUtil.java:36)
- at com.youngor.dboperator.Entity.getInstance(Entity.java:103)
- at com.youngor.dboperator.SQLServer2000Adaptor.getEntitySetBySQL(SQLServer2000Adaptor.java:283)
- at com.youngor.dboperator.SQLServer2000Adaptor.getEntitySet(SQLServer2000Adaptor.java:220)
- at com.youngor.dboperator.InnerDBOperator.getEntitySet(InnerDBOperator.java:451)
- at com.youngor.dboperator.DBOperator.getEntitySet(DBOperator.java:350)
- at com.youngor.dboperator.DefaultDB.getEntitySet(DefaultDB.java:147)
- at com.youngor.dboperator.DefaultDB.getEntitySet(DefaultDB.java:213)
- at com.youngor.webcore.entity.SysUser.getEntitySet(SysUser.java:501)
- at com.youngor.webcore.entity.SysUser.doTest(SysUser.java:610)
- at org.apache.jsp.login_jsp._jspService(login_jsp.java:66)
- at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
- at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
- at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
- at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
- at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
- at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
- at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
- at java.lang.Thread.run(Thread.java:619)
- java.lang.NullPointerException
- at com.youngor.dboperator.SQLServer2000Adaptor.getEntitySetBySQL(SQLServer2000Adaptor.java:284)
- at com.youngor.dboperator.SQLServer2000Adaptor.getEntitySet(SQLServer2000Adaptor.java:220)
- at com.youngor.dboperator.InnerDBOperator.getEntitySet(InnerDBOperator.java:451)
- at com.youngor.dboperator.DBOperator.getEntitySet(DBOperator.java:350)
- at com.youngor.dboperator.DefaultDB.getEntitySet(DefaultDB.java:147)
- at com.youngor.dboperator.DefaultDB.getEntitySet(DefaultDB.java:213)
- at com.youngor.webcore.entity.SysUser.getEntitySet(SysUser.java:501)
- at com.youngor.webcore.entity.SysUser.doTest(SysUser.java:610)
- at org.apache.jsp.login_jsp._jspService(login_jsp.java:66)
- at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
- at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
- at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
- at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
- at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
- at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
- at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
- at java.lang.Thread.run(Thread.java:619)
问题补充:
public static Class[] complie(JavaFile[] files) throws Exception 这个方法是用main(String[] args)方法测试成功。放到JSP页面中调用输错。错误信息已经在上面给出。
问题补充:
把com.youngor.*之类的类文件,放到tomcat下的common或shared下对应的classes或lib下,应该就不会报这个异常 或许可以解决问题。但是这不太符合Web应用部署的常规做法,不知“lovewhzlq”是否还有其他可行方法,不吝赐教。
问题补充:
问题基本解决,需要为编译过程指定编译的类路径;
- C:\myproject>javac -help
- 用法:javac <选项> <源文件>
- 其中,可能的选项包括:
- -g 生成所有调试信息
- -g:none 不生成任何调试信息
- -g:{lines,vars,source} 只生成某些调试信息
- -nowarn 不生成任何警告
- -verbose 输出有关编译器正在执行的操作的消息
- -deprecation 输出使用已过时的 API 的源位置
- -classpath <路径> 指定查找用户类文件的位置
- -cp <路径> 指定查找用户类文件的位置
- -sourcepath <路径> 指定查找输入源文件的位置
- -bootclasspath <路径> 覆盖引导类文件的位置
- -extdirs <目录> 覆盖安装的扩展目录的位置
- -endorseddirs <目录> 覆盖签名的标准路径的位置
- -d <目录> 指定存放生成的类文件的位置
- -encoding <编码> 指定源文件使用的字符编码
- -source <版本> 提供与指定版本的源兼容性
- -target <版本> 生成特定 VM 版本的类文件
- -version 版本信息
- -help 输出标准选项的提要
- -X 输出非标准选项的提要
- -J<标志> 直接将 <标志> 传递给运行时系统
修改部分代码如下:
- String cp=PathTool.get(AdvancedCompilerAPIDemo.class);
- Log.info(cp);
- int i=cp.indexOf("/WEB-INF/classes/");
- cp=cp.substring(0, i+17);
- Log.info(cp);
- Iterable<String> options = Arrays.asList("-d", cp,"-cp",cp); // 编译选项,将编译产生的类文件放在当前目录下
- CompilationTask task = compiler.getTask(null, fileManager,
- diagnostics, options, null, sourcefiles);
这里找到了WEb应用的classes目录并设置为编译输出目录和类路径。编译通过并可以使用了。
Java_JAVA6动态编译的问题的更多相关文章
- (转载)JAVA动态编译--字节代码的操纵
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...
- ZKWeb网站框架的动态编译的实现原理
ZKWeb网站框架是一个自主开发的网页框架,实现了动态插件和自动编译功能. ZKWeb把一个文件夹当成是一个插件,无需使用csproj或xproj等形式的项目文件管理,并且支持修改插件代码后自动重新编 ...
- java动态编译笔记
1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...
- c#动态编译并动态生成dll
/// <summary> /// 动态编译并执行代码 /// </summary> /// <param name="code">代码< ...
- Java动态编译
程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...
- Java_动态编译总结
不多说直接上代码: 动态编译的主类: package com.lkb.autoCode.util; import com.lkb.autoCode.constant.AutoCodeConstant; ...
- 重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译
多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便.加上我目前需要转java方向,于是决定自己搞.到目前为止花了整整一个星期了,看看目前的成果. 最后是代码工程文件,用c# ...
- 浅谈VB.Net 程序的编译和动态编译
---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...
- .NET中的动态编译
代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外 ...
随机推荐
- oracle 11g r1 RAC增加新节点
在一套两节点的rac上增加一个新的节点,详细的操作记录如下: 已有节点RAC1,RAC2 一,环境及版本: 公司环境:Vmware Esxi 5.5 操作系统:Redhat 5.8 x86_64 ...
- HYSBZ 2440 完全平方数(莫比乌斯反演)
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2440 若i为质数,n为i*i的倍数,则称n为含平方因子数. 求1~n的无平方因子数. F(x) ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
- POJ 1061 同余方程
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是 它们出发之前忘记了一件很重要的事情,既没有问清楚对方的 ...
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
转自:http://blog.csdn.net/kiddy19850221/article/details/6655066 uint8_t / uint16_t / uint32_t /uint64_ ...
- 借助mosquitto“实时”远程监控服务器数据库运行状态
公司的项目还处于开发阶段,我把整个后台服务临时放在阿里云上供前端测试,用的阿里云的ECS云服务器,HTTP请求服务器和数据库服务都安装在一台机子上(穷啊,凑合用),做测试用,配置相当低:单核1Gb.其 ...
- Android中log使用方法
private static final String ACTIVITY_TAG="MainActivity"; Log.v(MainActivity.ACTIVITY_TAG, ...
- 在Asp.Net MVC中设定site路径所对应的默认action
设置路由的default的Controller和Action可以达到我们预期的效果,代码如下所示: public class RouteConfig { public static void Regi ...
- 在Eclipse中用图形界面的方式获取Salesforce中Object的Query语句
对Salesforce中的Object进行相应的Query是必不可少的操作,大家可以去这个链接去看看官网的解读 http://docs.database.com/dbcom/en-us/db_sos ...
- Java学习笔记(一)——HelloWorld
一.安装JDK 1.下载链接: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.直接安装,不能有中文路径 3. ...