目前,我正在尝试在 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