Ant自动编译Java project时无法找到rt.jar的处理方法
2014-01-23 15:46
423 查看
最近在使用Ant自动化编译打包一个Java项目,执行时总是报有class找不到:
[javac] Compiling 46 source files to /A/B/C/D/build/staging/bin
[javac] .../ChangePassWordTool.java:5: package com.sun.org.apache.xml.internal.security.utils does not exist
[javac] import com.sun.org.apache.xml.internal.security.utils.Base64;
[javac] ^
[javac] .../ChangePassWordTool.java:39: cannot find symbol
[javac] symbol : variable Base64
[javac] location: class com.xxx.ChangePassWordTool
[javac] passWord = Base64.encode(passWord.getBytes());
[javac] ^
[javac] 2 errors
由于在eclipse中使用ant插件编译打包该项目没有问题,纳闷为啥出现该异常。
首先定位该类:com.sun.org.apache.xml.internal.security.utils.Base64,发现是在jre/rt.jar中,因此第一步怀疑是ant的配置文件有问题,将build.xml中的文件调整如下:
但是调整之后,编译打包还是报上述错误, 后查询资料发现, 是由于javac编译代码的行为所致。
javac在编译代码时,当他尝试从rt.jar中找寻对应的类文件时,他会默认从对应的符号表文件ct.sym (同样在jre/lib/下)中查找该类是否存在,由于ct.sym中有意或无意的遗失了部分rt.jar中的类,包括我使用的com.sun.org.apache.xml.internal.security.utils.Base64,因此导致编译报错。
解决方法就是通知javac编译器,在编译代码时,忽略该符号表ct.sym, 直接查找rt.jar,通过给javac传入对应的参数完成:-XDignore.symbol.file
在配置文件中即为:
编译成功
[javac] Compiling 46 source files to /A/B/C/D/build/staging/bin
[javac] .../ChangePassWordTool.java:5: package com.sun.org.apache.xml.internal.security.utils does not exist
[javac] import com.sun.org.apache.xml.internal.security.utils.Base64;
[javac] ^
[javac] .../ChangePassWordTool.java:39: cannot find symbol
[javac] symbol : variable Base64
[javac] location: class com.xxx.ChangePassWordTool
[javac] passWord = Base64.encode(passWord.getBytes());
[javac] ^
[javac] 2 errors
由于在eclipse中使用ant插件编译打包该项目没有问题,纳闷为啥出现该异常。
首先定位该类:com.sun.org.apache.xml.internal.security.utils.Base64,发现是在jre/rt.jar中,因此第一步怀疑是ant的配置文件有问题,将build.xml中的文件调整如下:
<project default="prod" basedir="."> ... <property environment="env" /> <property name="java.jre.lib.dir" value="${env.JAVA_HOME}/jre/lib" /> <!-- classpath used for javac --> <path id="classpath"> <fileset dir="lib" includes="*.jar"/> <fileset dir="${java.jre.lib.dir}"> <include name="*.jar" /> </fileset> </path> ... <target name="compile" depends="init"> <javac srcdir="src" destdir="${staging}/bin" encoding="UTF-8" source="1.6" target="1.6" nowarn="on" debug="on" optimize="on" includeantruntime="false"> <classpath refid="classpath" /> </javac> </target> </project>
但是调整之后,编译打包还是报上述错误, 后查询资料发现, 是由于javac编译代码的行为所致。
javac在编译代码时,当他尝试从rt.jar中找寻对应的类文件时,他会默认从对应的符号表文件ct.sym (同样在jre/lib/下)中查找该类是否存在,由于ct.sym中有意或无意的遗失了部分rt.jar中的类,包括我使用的com.sun.org.apache.xml.internal.security.utils.Base64,因此导致编译报错。
解决方法就是通知javac编译器,在编译代码时,忽略该符号表ct.sym, 直接查找rt.jar,通过给javac传入对应的参数完成:-XDignore.symbol.file
在配置文件中即为:
<javac srcdir="src" destdir="${staging}/bin" encoding="UTF-8" source="1.6" target="1.6" nowarn="on" debug="on" optimize="on" includeantruntime="false"> <compilerarg value="-XDignore.symbol.file"/> <classpath refid="classpath" /> </javac>
编译成功
相关文章推荐
- 全面挖掘Java Excel API 使用方法
- 老生长谈,使用spring发送mail
- springmvc拦截过滤静态资源的一种方法
- Spring MVC 框架搭建及详解
- 方立勋JavaWeb学习笔记第四天
- 深入Java class文件格式
- java编写程序查找出在一个字符串中出现次数最多的字母
- java多线程编程之使用Synchronized块同步变量
- 深入探讨 Java 类加载器
- java解析JSON字符串
- java多线程编程之使用Synchronized块同步方法
- Spring3 MVC详解三
- 在win7中配置eclipse图片方法
- 学习——>Android开发环境搭建 jdk+eclip+android sdk
- java多线程编程之使用Synchronized关键字同步类方法
- 【转】java文件操作大全
- java多线程编程之为什么要进行数据同步
- Spring学习笔记(三)--Convert System设计
- Note for Eclipse
- Note for Eclipse