【问题标题】:How to set a lib directory running an ant script from Java?如何设置从 Java 运行 ant 脚本的 lib 目录?
【发布时间】:2014-04-30 09:39:54
【问题描述】:

在我的 Ant 构建脚本中,我使用以下几行设置我的 xslt 处理器:

    <xslt>
        <factory>
            <attribute name="http://saxon.sf.net/feature/xinclude-aware" value="true" />
            <attribute name="http://saxon.sf.net/feature/version-warning" value="false" />
        </factory>
        <classpath>
            <fileset dir="${param}/lib">
                <include name="saxon9.jar" />
            </fileset>
        </classpath>
    </xslt>

当ANT从命令行运行时,像这样

"C:\Programs\jre\bin\java.exe" -classpath "C:\ant\lib\ant-launcher.jar" "-Dant.home=C:\ant" org.apache.tools。 ant.launch.Launcher 安装 -Dparam "C:\dir" basedir "C:\dir2\bin" -emacs -f "C:\dir2\build.xml"

构建成功完成。但是,当我从这样的 java 程序中调用脚本时:

File buildFile = new File(dir2 + "/build.xml");
Project p = new Project();

p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.setUserProperty("ant.library.dir", "C:/dir2/lib");
p.setUserProperty("param", "C:/dir");
p.setBasedir("C:/dir2/bin");               

DefaultLogger consoleLogger = new DefaultLogger();

consoleLogger.setEmacsMode(true); 
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);

try {
 p.fireBuildStarted();
 p.initProperties();
 p.init();
 ProjectHelper helper = ProjectHelper.getProjectHelper();
 p.addReference("ant.projectHelper", helper);
 helper.parse(p, buildFile);

p.executeTarget("Install");
p.fireBuildFinished(null);
} catch (BuildException e) {
   p.fireBuildFinished(e);
}

程序返回以下 xslt 错误:TransformerFactory 无法识别属性“http://saxon.sf.net/feature/xinclude-aware”。在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.setAttribute(未知来源)。此错误与How to execute XSLT 2.0 with ant? 中的类似。

我尝试了几个选项来设置包含 saxon 的 lib 目录(如 ant.lib.directory),但这没有任何效果。从java(或强制noclasspath)设置lib目录的正确方法是什么?

【问题讨论】:

    标签: java ant saxon


    【解决方案1】:

    您是否尝试将“工厂”元素的“名称”属性设置为“net.sf.saxon.TransformerFactoryImpl”?

    【讨论】:

    • 是的,我做到了。它在使用 1.8.1 之后的 ant 版本时有效。然而,因为我无法控制我调用的构建文件,我不得不使用 ant 1.7。工厂元素的名称属性上的 TransformerFactory 被忽略了。为 Saxon 设置类路径并在我的 Java 代码中添加 System 变量使我的处理器保持在 Saxon 上: System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl"); TransformerFactory tfactory = TransformerFactory.newInstance();
    • 不幸的是,该领域的 Ant 漏洞由来已久。我怀疑他们没有一套好的测试用例,但这只是猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2023-01-30
    相关资源
    最近更新 更多