Ant自动编译Java project时无法找到rt.jar的处理方法
来源:互联网 发布:淘宝设置提醒在哪里看 编辑:程序博客网 时间:2024/05/02 18:57
最近在使用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中的文件调整如下:
- <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>
编译成功
- Ant自动编译Java project时无法找到rt.jar的处理方法
- Ant自动编译Java project时无法找到rt.jar的处理方法
- Ant自动编译Java project时无法找到rt.jar的处理方法
- ant调用外部ant,并变编译项目,无法找到rt.jar的处理方法
- Ant找不到rt.jar
- 关于使用gradle构建的java项目中使用到rt.jar不能编译通过的处理
- Eclipse无法编译rt.jar中的某些包解决办法
- Eclipse无法编译rt.jar中的某些包解决办法
- eclipse无法编译rt.jar某些类问题
- eclipse无法自动编译Java文件的方法大全。
- java中rt.jar包的含义
- 关于java无法加载到rt.jar文件
- Maven 编译使用 rt.jar
- Ant编译Java项目成jar
- Eclipse 发布 web project 时 jar 无法发布的问题
- ANT编译Project
- 无法运行ant构建出来的jar
- Qt交叉编译时ICPC命令未找到处理方法
- ios 深入浅出多线程(GCD)
- HDU Palindrome subsequence(区间DP)
- Java程序性能优化
- JAVA对象JSON数据互相转换的四种常见情况
- wamp下安装thread扩展
- Ant自动编译Java project时无法找到rt.jar的处理方法
- android studio 运行报错 W/ dalvikvm threadid=1 thread exiting with uncaught exception group=0x41c57c50
- set中的greater()以及set的一些用法
- Java 多线程同步与锁
- Codis 的设计与实现 Part 1
- Zigzag矩阵生成
- JWS 批注参考WebService注解
- appStore最新审核规则
- 机器学习实战-第三章决策树-代码理解-读书笔记