蚂蚁罐头';从Java运行时找不到XPathExpressionException,但在构建Android应用程序时在命令行上找到
目前,我正在尝试在GlassFish服务器上使用Ant构建一个android应用程序 当我从命令行运行蚂蚁罐头';从Java运行时找不到XPathExpressionException,但在构建Android应用程序时在命令行上找到,java,android,ant,glassfish,application-server,Java,Android,Ant,Glassfish,Application Server,目前,我正在尝试在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:
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行是:
它引用了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>
setupSDK(dir)
使用JVM标志或环境变量ANDROID_HOME动态创建local.properties文件(并正常工作)
就这样
我相信这些都是相关的东西。我在一台全新的64位JDK Windows8机器上运行这个程序,但在运行32位JVM的Windows7机器上运行时,它也有同样的问题
正如我上面所说,当我在命令行上运行antrelease
或antdebug
时,它就可以工作了,所以我不知道为什么它不能从Java工作
更新
经过一些测试后,它似乎可以在Java上运行,而不是在GlassFish服务器上运行。有人有什么想法吗
谢谢,林登
另一个更新
我的一位同事建议这可能与作用域有关,而我正试图在GlassFish域之外加载类,这似乎就是原因
更新
这似乎是事实,尽管我不完全确定如何解决它。
我刚刚发现,在Glassfish之外运行时,给出的类路径Ant非常长,包括所有Glassfish模块(我认为)以及来自JDK的正确运行时(包括rt.jar)
而在glassfish上运行时,java类路径上唯一的东西是:C:\Program Files\glassfish-3.1.2.2\glassfish\modules\glassfish.jar如果不清楚我在尝试做什么:我有一个应用程序,它根据一些用户输入为android应用程序创建源代码,然后我想建立apk文件,并将其返回给用户下载。如果有人可以帮助,仍然需要帮助。我在另一个非android的构建文件上进行了测试,该文件运行成功,因此我需要知道如何配置/放置android SDK,以便成功加载类。我改变了调用ant的方式,以便将相关库构建到我正在使用的jar中,并且功能就在那里。在GlassFish上运行时,这仍然会导致相同的问题。然而,如果我将我的应用服务器更改为Tomcat,它似乎可以正常工作,这是非常奇怪的。
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