0

我正在使用Enunciate构建原型 REST api,并且需要包含一个包含自定义代码的 jar 作为库。

我的 Ant 脚本如下所示:

<!--include all jars-->
<path id="en.classpath">
    <fileset dir="${lib}">
        <include name="**/*.jar" />
    </fileset>
</path>

<!--define the task-->
<taskdef name="enunciate" classname="org.codehaus.enunciate.main.EnunciateTask">
    <classpath refid="en.classpath" />
</taskdef>

<mkdir dir="${dist}" />

<enunciate dir="${src}" configFile="${basedir}/enunciate.xml">
    <include name="**/*.java" />
    <classpath refid="en.classpath"/>
    <export artifactId="spring.war.file" destination="${dist}/${war.name}" />
</enunciate>

问题是我的自定义 jar 被排除在 WAR 文件之外。有必要编译 enunciate 带注释的类,因此 jar 在编译时显然位于类路径上,但 enunciate 未能将其包含在分发中。我还注意到 enunciate 所需的几个 jar 没有包含在 WAR 文件中。

为什么他们被排除在外,我该如何解决?

4

3 回答 3

2

我从未使用过发音,但作为一种快速破解,您可以将罐子添加到战争中:

<jar jarfile="${dist}/${war.name}" update="true">
   <fileset dir="${lib}">
        <include name="**/*.jar" />
    </fileset>
</jar>

注意:您可能希望将 jars 添加到WEB-INF/lib目录,而不是根目录。

我猜 enunciate 会干扰你自己的构建过程,因为你最清楚在你的 jar 文件中放什么。

于 2008-10-21T10:41:02.083 回答
1

事实证明,我们试图包含的其中一个 jar 在它的 Manifest 文件中列出了 Enunciate 所依赖的 jar(freemarker)。Enunciate 自动排除了 freemarker,乍一看,它似乎也自动排除了任何依赖于 freemarker 的东西。如果我们从代码清单文件中的依赖 jar 列表中删除 freemarker,它就可以正常工作。

然而; 我已经与 Enunciate 的主要开发人员 (Ryan Heaten) 进行了交谈,他向我保证这不是正在发生的事情。包括他的回复如下:

真的?!

哇。有趣的。我无法解释;Enunciate 不会查看清单中的内容来确定战争中包含的内容,所以我在这里有点难过。它也可能是一些奇怪的 Ant 行为(由于某种原因,不包括“en.classpath”引用中的那个 jar)。

〜瑞安

于 2009-06-29T13:28:45.793 回答
0

在 enunciate.xml 我告诉它不要复制任何库本身:

<webapp doLibCopy="false">

然后在 enunciate 任务结束时的 ant 构建文件中更新战争(您可以这样做来更新包含/排除的 jars,无论您是否在上面的步骤中为您复制了 jars):

<war destfile="build-output/{mywar}" update="true">
    <lib dir="WebContent/WEB-INF/lib">
        <include name="**/*.jar" />
    </lib>
    <lib dir="build-output">
        <include name="some_other.jar" />
    </lib>
</war>
于 2015-09-10T20:14:06.250 回答