目前,我正在尝试在 GlassFish 服务器上使用 Ant 构建一个 android 应用程序。
当我运行ant debug或ant release从命令行运行时,我当前的 build.xml 将构建良好,但是当我尝试通过 Java 构建它时,它会引发异常并告诉我它找不到类:javax/xml/xpath/XPathExpressionException
错误消息的相关部分是:
C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\ant\build.xml:109: taskdef A class needed by class com.android.ant.GetTypeTask cannot be found: javax/xml/xpath/XPathExpressionException
using the classloader AntClassLoader[C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\anttasks.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\common.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\guava-tools.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\sdklib.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\layoutlib_api.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-compress-1.0.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpclient-4.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpcore-4.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\httpmime-4.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-logging-1.1.1.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\commons-codec-1.4.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\dvlib.jar;C:\androidsdk\adt-bundle-windows-x86_64\sdk\tools\lib\manifmerger.jar]
android build.xml 的第 109 行是:<taskdef resource="anttasks.properties" classpathref="android.antlibs" />
它指的是 anttasks.jar 中的一个文件,其中有一个用于 xpath 的条目。
构建文件
应用程序的构建文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project name="2007_doc2" default="help">
<property file="local.properties"/>
<property file="ant.properties"/>
<property environment="env"/>
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME"/>
</condition>
<loadproperties srcFile="project.properties"/>
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<import file="custom_rules.xml" optional="true"/>
<import file="${sdk.dir}/tools/ant/build.xml"/>
</project>
我的 ant.properties 文件是空的,local.properties 文件正确指向 SDK,而 project.properties 文件中唯一的内容是:target=android-10
Java 代码
我用来尝试运行 Ant 的 Java 代码都在一个类中,看起来像这样(为了节省空间而缩短了):
setupSDK(dir);
Project project = new Project();
project.setUserProperty("ant.file", buildFile.getAbsolutePath());
project.setBaseDir(dir);
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
project.addBuildListener(consoleLogger);
project.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
project.addReference("ant.projectHelper", helper);
helper.parse(project, buildFile);
project.executeTarget(project.getDefaultTarget()); // build
setupSDK(dir)使用 JVM 标志或环境变量 ANDROID_HOME 动态创建 local.properties 文件(并且工作正常)。
而已
这就是我相信的所有相关内容。我在带有 64 位 JDK 的全新 Windows 8 机器上运行它,但在运行 32 位 JVM 的 Windows 7 机器上运行时它有同样的问题。
正如我上面所说,它在我运行ant release或ant debug在命令行上运行时,所以我不知道为什么它不能在 Java 中运行。
更新
经过一些测试,当不在 GlassFish 服务器上运行时,它似乎实际上可以在 Java 中运行。有人有想法么?
谢谢,林登
另一个更新
我的一位同事建议这可能与范围有关,而且我试图在 GlassFish 域之外加载类,这似乎是原因。
更新
情况似乎确实如此,尽管我不完全确定如何解决它。我刚刚发现,当在 Glassfish 之外运行时,给出的类路径 Ant 非常长,并且包括所有 glassfish 模块(我认为)以及来自我的 JDK(包括 rt.jar)的正确运行时。
而在 glassfish 上运行时,java 类路径上的唯一内容是:C:\Program Files\glassfish-3.1.2.2\glassfish\modules\glassfish.jar