- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑这段代码(完全基于飞碟的“入门”代码,保留他们的权利):
package flyingsaucerpdf;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextRenderer;
public class PDFMaker {
public static void main(String[] args) throws Exception {
new PDFMaker().go();
}
public void go() throws Exception {
String inputFile = "sample.html";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
}
一些事实:
Caused by: org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. at org.apache.xerces.dom.AttrNSImpl.setName(Unknown Source) at org.apache.xerces.dom.AttrNSImpl.(Unknown Source) at org.apache.xerces.dom.CoreDocumentImpl.createAttributeNS(Unknown Source) at org.apache.xerces.dom.ElementImpl.setAttributeNS(Unknown Source) at org.apache.xml.utils.DOMBuilder.startElement(DOMBuilder.java:307) ... 19 more
After looking for a while in the wrong place (for example, I created a child-first / parent-last class loader suspecting xalan / xerces jars, but it still fails), I finally narrowed down the root cause:
It seems that the web application that loads my code, has an old xalan.jar, specification version 1.2
I did a little test, I ran the code above as standalone (which worked fine before) but this time I added the xalan.jar from the web app to it's classpath, and bingo, the same error as in the web app scenario
So I inspected that old xalan.jar and wondered, what can cause the JVM to load it's old xalan implementation instead of the JDK's? after all my child-first class loader is also parent-last e.g. system in the middle, to say: searching the system classloader before the parent (to avoid loading parent overriden JDK jars, just like this case of the parent's xalan.jar overriding the JDK's xalan implementation)
Then something cought my eyes - a file in: xalan.jar/META-INF/services/ named javax.xml.transform.TransformerFactory with this content:
org.apache.xalan.processor.TransformerFactoryImpl
所以我立即在 eclipse 中按下 Ctrl+T 并寻找完整的合格名称......只在 xalan.jar 中!
然后我只搜索“TransformerFactoryImpl”,这就是 JDK 的内容:
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
容易看出区别
所以,如果您读到这里,我的底线问题是:如何让我的 TransformerFactory 使用 JDK 的实现而不是旧 Xalan 的实现?(我无法从中删除那个 jar我的代码将从中加载的网络应用程序)
最佳答案
看来答案比我想象的要简单。
在您的类加载器中,将此文件夹添加到类路径(不需要 jar):/META-INF/services/
在其中,创建一个名为 javax.xml.transform.TransformerFactory
对其进行编辑并将其设置为:com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
就是这样!
为什么有效?请参阅 Java 用于加载 Xalan 实现的此类。
请注意,对于特定的“META-INF”条目(与常规 Java 类加载器的工作方式相反,例如,父优先/子优先),它似乎实际上是父优先(或子优先)加载器但如果我错了,请随时纠正我
来自 javax.xml.datatype.FactoryFinder
的片段
/*
* Try to find provider using Jar Service Provider Mechanism
*
* @return instance of provider class if found or null
*/
private static Object findJarServiceProvider(String factoryId)
throws ConfigurationError
{
String serviceId = "META-INF/services/" + factoryId;
InputStream is = null;
// First try the Context ClassLoader
ClassLoader cl = ss.getContextClassLoader();
if (cl != null) {
is = ss.getResourceAsStream(cl, serviceId);
// If no provider found then try the current ClassLoader
if (is == null) {
cl = FactoryFinder.class.getClassLoader();
is = ss.getResourceAsStream(cl, serviceId);
}
} else {
// No Context ClassLoader, try the current
// ClassLoader
cl = FactoryFinder.class.getClassLoader();
is = ss.getResourceAsStream(cl, serviceId);
}
if (is == null) {
// No provider found
return null;
}
...
关于java - 如何防止具有 META-INF\services\javax.xml.transform.TransformerFactory 的 xalan.jar 接管 Xalan 实现中内置的 JDK 1.6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447633/
python 3.7 在编写最大值的搜索代码时,我遇到了负无穷大的奇怪行为。 有人可以解释为什么这种行为吗? >>> inf = float('inf') >>> inf is inf True >>
我是 Julia 的新手 - Windows 上的 1.0.0 版。 documentation陈述如下 julia> Inf / Inf NaN 但是当我执行以下操作时,我得到了不同的结果 juli
我是 Julia 的新手 - Windows 上的 1.0.0 版。 documentation陈述如下 julia> Inf / Inf NaN 但是当我执行以下操作时,我得到了不同的结果 juli
我正在使用用 Objective-C 编写的第三个 CocoaPods 库来截取 UITextView 的屏幕截图。 iOS 8 没问题,但在我更改 iOS 9 和 Swift 2 的语法后,它会抛出
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我已经从 Intellij 为 Spark+ scala 代码创建了 jar 并尝试在开发集群中运行该 jar,但最终出现以下错误: Exception in thread "main" java.l
我有一个包含如下标记的 jsp 文件: 在我的应用中,部署结构是: WEB-INF |-lib |-some.jar |-META-INF
我正在尝试在大型数据集 (5000x300) 上运行 randomForest。不幸的是,我收到如下错误消息: > RF df2 df2 character(0) > df2 df2 numer
我想返回 +INF 但我只返回“inf”: int main(void) { double dubb = HUGE_VAL; printf("%f \n", dubb); } 我是不是
我不明白为什么在以下两种情况下除以 0 会产生不同的结果。amort 是一个计算常量摊销计划的函数。我们现在唯一关心的是 A 的最后一个元素恰好为 0。 amort = @(r,M) ((1+r).^
在 C 中,在使用 IEEE-754 float 的实现中,当我比较两个为 NaN 的 float 时,它返回 0 或“false”。但是为什么两个都为 inf 的 float 相等呢? 这个程序打印
以下代码生成结果-inf。 fn main() { println!("{}", (-10. / 0.)); } 但是,当我尝试下面的代码时,它没有打印出 true,而是给我一个错误。 fn
Numpy 的 log 方法为 log(0) 提供 -inf。这个值是可比较的: >>> np.log(0) == np.log(0) True 现在在单元测试中以下工作正常: self.assert
在下一种情况下哪种方法更好: 我需要获取一些按分数排序的元素,我可以使用这两种方法: 1. zrange myZset 1 5 WITHSCORES 2. zrangebyscore myZset
我正在尝试解释 Web 应用程序的基础知识。我在 META-INF 和 WEB-INF 上遇到了这个问题。这些目录是如何获得这些名称的? 最佳答案 Jar 文件实际上是 ZIP 文件,带有额外的信息和
我正在使用修改后的kanderson-well beats委托版本来修改AVKit需要的请求。所有代码将在帖子的底部。修改请求、创建字幕播放列表并将它们添加到主播放列表中是很好的,因为它们在请求AVM
当您有符合 IEEE754 标准的浮点实现时,与 NaN 的任何比较都是 false,即使是 NaN == NaN,但是+inf == +inf 是 true,为什么? 从我的角度来看,说 +inf
R 中是否有一个函数可以确定值是否为 NA , NaN , Inf , -Inf ,否则不是一个格式良好的数字? 最佳答案 你要is.finite > is.finite(NA) [1] FALSE
我们有一个应用程序,我们正在使用 InstallShield LE(Visual Studio 2010 附带的那个)来管理应用程序的安装。 作为安装的一部分,我需要安装一个 INF 文件,以便应用程
我正在将应用程序移植到 tomcat,我怀疑以下类加载可能是个问题... 如果我在 WEB-INF/classes 中有一个类需要一个在 WEB-INF/lib 中的类,他们找不到它。 如果我在 WE
我是一名优秀的程序员,十分优秀!