我正在更新一个遗留应用程序,以使用Java 6 SE而不是Java 5 SE。该应用程序使用JAXB,在Java 5 SE下,它在类路径上有JAXB参考实现jar。当我迁移到Java 6 SE(更新38)时,我遇到了一些问题(参见链接的Stackoverflow问题),在一些帮助下我解决了这些问题。
所以下一个引起麻烦的是Ant构建脚本项目。当Ant编译任务执行时,它会获取Java6 SE附带的嵌入式JAXB版本,而不是我在类路径中包含的jar版本(JAXB 2.2.6版本)。我相信Java6 SE包含JAXB 2.1. x。这会导致如下编译时错误:
[javac] location: @interface javax.xml.bind.annotation.XmlElementRef
[javac] @XmlElementRef(name = "abbrev", type = JAXBElement.class, required = false)
在这种情况下,JAXB 2.1.x 中的@XmlElementRef不存在“required”属性,但在 2.2.x 中却存在。
如何更改我的 Ant 构建脚本,使其从构建类路径中获取 JAXB 2.2.6 jar,而不是 Java 6 SE JDK 中打包的类?
更新:基于Peter答案的解决方案
<target name="compile" depends="clean">
<javac deprecation="on"
classpathref="prj.classpath"
srcdir="${src}"
destdir="${build.dir}"
debug="on"
debuglevel="lines,vars,source"
source="1.6">
<compilerarg value="-Djava.endorsed.dirs=${lib.ext.dir}/jaxb"/>
</javac>
</target>
只需将jaxb 2.2实现(例如jaxb-impl.2.2.5)添加到编译器的类路径中
<compilerarg value="-cp path_to_jaxb2_jar"/>
这就足够了,JAXB将根据来自jar的META-INF/services/的信息自动发现新的JAXB提供者,并使用它来代替默认的内部提供者。请参阅JAXBContext。newInstance API“发现JAXB实现”
我相信背书图书馆文件夹的概念是你的朋友。
即开关:
<compilerarg value="-Djava.endorsed.dirs=/some/path/lib/endorsed"/>
背书中的罐子将被视为优先于装载的任何其他类(我相信)。
有关更完整的示例,请参阅正确答案:如何让Ant更喜欢链接JAR中的类而不是JDK类?
我有一个JSF2(Richfaces 4.1.0)项目在eclipse中运行。我正在尝试使用mojarra jsf实现(2.2.0)在WAS 8.5上运行它。然后,maven提供了lib,但服务器似乎覆盖了它们,因为在控制台中,我可以读取Myfaces已加载。 我在想为什么会这样?如何让项目使用mojarra而不使用was管理控制台中的共享LIB? 这是代码中与maven相关的部分: 提前谢谢
我尝试在Ubuntu11.02的命令行上运行ant build.xml中的javac。然后运行“ant deploy-live”之后,命令行打印如下: 我关于javac的任务: 操作系统:Ubuntu 11.10(oneiric) Java版本:Java版本“1.7.0”Java(TM)SE运行时环境(build 1.7.0-B147)Java HotSpot(TM)64位服务器VM(build
尽管类路径上有所需的JAR,但我的编译目标中的任务失败。有人能帮我弄清楚为什么会这样吗? 下面的错误是由。然而,commons-io-1.3.1。jar位于构建路径上(在中)。所以,奇怪的是构建失败了。 令人惊讶的是,Eclipse构建项目没有任何问题。我在项目构建路径上有相同的jars集。我也有相同的源目录被排除在编译之外。 试图在源代码文件夹上使用javac可执行文件,但不确定如何在源代码目录
我的项目是用Maven构建的。我很高兴和Maven一起建造。现在,我需要用Ant构建它(我希望我不需要!!!)。我希望使用现有的maven依赖项——也就是说,希望保留pom进行依赖项管理。 所以,我写了这个任务: 但是,ant编译输出抱怨mypomdeps指向的库(在jars中)丢失了。 javac无法看到我想要的类路径的原因是什么? 我是否正确使用了由工件:依赖项生成的filesetId? 我的
问题内容: 我的build.xml中包含以下内容: 这主要完成了我想要的操作,只是(如评论所述)我 不 希望 该任务编译其中的文件(但我确实希望该任务下的 所有其他内容都编译)。 我是一个完整的ant n00b蚂蚁,该文档对我没有太大帮助。我在几个地方看到它说有各种各样的排除/排除元素/属性,但是我能想到的每一种变化都没有效果,或者导致诸如“ 等等 不支持’排除’属性”之类的错误。 问题答案: 几
问题内容: 我有一个导入一些servlet库的类。当我从命令行编译它时就可以了。 当我使用ant编译任务对其进行编译时,它会给出错误,即在其路径中找不到servlet库。 那是已知/常见的事件吗? 这是我的Ant目标: 问题答案: 如果您没有在任务的类路径中正确指定servlet库,这是一种常见的情况…我怀疑这就是问题所在。如果您发布失败的任务和有效的命令行,我们将为您提供更多帮助。