- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个问题已经被问过几次了,但不是很令我满意。我对提出的解决方法并不真正感兴趣,但对如何做我真正想做的事情不感兴趣。
想要一个令人满意的解释,说明为什么这不可能,如果不可能的话,并且由于我建议自己提交一个修复程序,所以我想了解为什么看起来如此简单的事情没有被解决尝试过。
目前,要确保一组 jar 可用于 ant,必须应用以下方法之一:
CLASSPATH
环境变量 - 在文档中“不推荐”$ANT_HOME/lib
或 ~/.ant/lib
- 需要在构建环境中配置ant
调用中设置 -lib
参数最后一个选项是我已经确定的首选选项,但它仍然需要调用构建的人进行一些干预(我在开发中的 ant
包装器脚本中捕获了它存储库)。
特别是我正在尝试调用 Schematron Ant应根据the documentation设置的任务像这样:
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar"/>
但是这对 saxon 具有传递依赖性,因此如果 CLASSPATH
上没有可用的 saxon.jar
,构建将失败:
java.lang.NoClassDefFoundError: net/sf/saxon/TransformerFactoryImpl
ant documentation itself继续建议它应该是 taskdef 本身获取这些额外的 CLASSPATH
条目,但我已经用 schematron ant-task 尝试了这个但没有成功。
关键问题是 schematron ant 任务是否应该支持这一点,或者 ant build.xml 是否可以在其自身内部配置其全局类路径?
这似乎是人们经常想做的事情,而且由于 ant 文档本身建议不要自己使用 CLASSPATH,我很惊讶在 build.xml 本身中没有其他选择!
最佳答案
这似乎是 Schematron 任务中的错误。 Ant 任务加载 Saxon XSLT 处理器的方式要求 Saxon 位于系统类路径上,即使任务本身位于辅助类加载器上也是如此。
乍一看this code in ValidatorFactory看起来足够明智:
private TransformerFactory _factory = TransformerFactoryImpl.newInstance();
(其中 TransformerFactoryImpl
是 Saxon 对 TransformerFactory
的实现),但实际上 TransformerFactoryImpl
并没有定义 newInstance()
方法,所以这是从 TransformerFactory
继承的 newInstance
,它将根据 javax.xml 的值查找合适的工厂。 transform.TransformerFactory
系统属性。 Ant 任务 does set this system property :
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
但 TransformerFactory.newInstance()
将在系统类加载器上查找此类,不一定在加载 schematron 任务的类加载器上查找。
修复方法是将 ValidatorFactory
行 120 简单地更改为
private TransformerFactory _factory = new TransformerFactoryImpl();
这将绕过所有动态查找并直接实例化正确的类。有了这个修复
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar:lib/saxon9he.jar"/>
会正常工作。
我建议您向开发人员报告错误,但该项目看起来并不特别活跃,因此您可能只需要构建自己的本地分支...
关于java - 在 build.xml 中设置 ANT CLASSPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132201/
要求: 仅命令行,即没有 IDE 不想使用classpath参数 操作系统:OS X v10.6.8 步骤: 设置 CLASSPATH 环境变量:export CLASSPATH="/path-jar
将 JAR 添加到 IDE 中项目的 CLASSPATH 与将其添加到系统范围的 CLASSPATH 之间有什么区别? 最佳答案 后者对您正在运行的所有 java 应用程序都有效,而前者仅对项目有效。
我想做一个 setenv CLASSPATH /somethig/foo/junit-4.9.jar 类似的东西。进行一些搜索后(未检测到命令 setenv)。我发现我必须改用 export CLAS
在我的 RAD 中,当我启动它并转到我的工作区时,我经常看到一些项目有一个红色的错误十字标志。通常消息是某些库丢失等。但是通过转到每个项目的构建路径,我可以看到这些库存在于构建路径中。 我一直在通过删
在我的 RAD 中,当我启动它并转到我的工作区时,我经常看到一些项目有一个红色的错误十字标志。通常消息是某些库丢失等。但是通过转到每个项目的构建路径,我可以看到这些库存在于构建路径中。 我一直在通过删
这个问题在这里已经有了答案: Java will -classpath option add or replace CLASSPATH environment variable (4 个答案) 关闭
将 -classpath 选项与 java 一起使用是否会添加或替换 CLASSPATH 环境变量的内容? 最佳答案 使用类路径变量,它会覆盖环境变量的 CLASSPATH,但仅限于该 session
我有一个相对较大的 Java 应用程序,它将受益于对 Python 的一些热爱。为此,我一直致力于在 Jython 中启动和运行它。我目前的障碍是使类路径正确。 我采取了两种方法来设置类路径: 使用
这里我查看环境变量CLASSPATH daniel@daniel-laptop:~/ps/clojure/projects/ring-tutorial$ echo $CLASSPATH /home/d
我在该位置有文件 --src --> main --> config --> application --> context --> reference
MyClassWithMainMethod.java 使用 someJar.jar 的类。 如果我打电话: java -cp someJar.jar MyClassWithMainMethod 我得到
我正在处理一些 Spring XML 配置文件,有时它们使用 "classpath:/datasource.xml",有时使用 "classpath:datasource.xml"。两者有区别还是前导
Maven 识别 4 个类路径: maven.compile.classpath:编译源代码时需要在类路径中的类和 jar。所以基本上对于 maven-compiler-plugin maven.te
我想做一些类似于jython -cp FOO:BAR:BAZ argle.py的事情。 如果我将 FOO、BAR 和 BAZ 添加到 $CLASSPATH 中,则可以正常工作。我尝试在运行时将它们添加
我想确保 JAR 在部署到服务器之前不会抛出 NoClassDefinitionFound 异常。更高级的要求是能够指定额外的类路径。 如何做到这一点? 最佳答案 一般来说这是不可能的,因为您的 JA
我对 Java 还很陌生,只完成了编程入门类(class)的大部分内容,目前正在尝试通过实践来学习。在我设置了 libgdx 项目并导入它之后,我收到这两个警告,都说: “以下类路径条目在服务器的类路
同时尝试 mavenize Eclipse plugin for LESS遇到问题 #210 在 #208 中添加了提交 https://github.com/PaulVI/ow/commit/7c9
案例1: java -cp LRS3rdPartyClient.jar -jar tasks.jar 案例2: java -classpath LRS3rdPartyClient.jar;tasks
我正在尝试在Windows 7计算机上安装gradle 1.3并执行以下步骤 1.从http://www.gradle.org/网址下载了gradle-1.3.all.zip 2.将其提取到 F:\
我有一个名为App.jar的jar,其结构如下 App.jar | | |---xyzfolder | | | |--config
我是一名优秀的程序员,十分优秀!