Apache Ant/创建 .xar 文件
外观
这个例子正在开发中!
您想直接从您的源代码中创建一个 XML 归档文件(.xar 文件),该文件可用于将库模块或应用程序加载到本机 XML 数据库中。这使得用户更容易安装您的模块或应用程序。打包过程会将您的文件上传到正在运行的 eXist 服务器上的正确位置,并自动设置所有 XQuery 文件(.xq)的权限。
我们需要创建一个包含所有正确组件的“zip”文件。
包的格式如下
eXist 特定包文档位于此处
http://demo.exist-db.org/exist/apps/doc/repo.xml
有三种类型的安装包
- 不在数据库中的外部库
- 加载到数据库中的库
- 具有 GUI 的完整应用程序
对于所有没有 GUI 但部署到数据库中的库应用程序,您必须使用两个属性,一个用于目标,类型为“library”,使用以下结构
target="some /db path" + type="library"
对于仅需要在 eXist 中注册但未部署在 exist 数据库中的简单 XQuery 库包,不应使用 target 属性。
no target + type="library"
归档文件必须在根目录中包含两个 XML 描述符文件:expath-pkg.xml 和 repo.xml
示例 expath-pkg.xml 文件
<package xmlns="http://expath.org/ns/pkg" name="http://example.com/apps/myapp"
abbrev="myapp" version="0.1" spec="1.0">
<title>My Cool Application</title>
<dependency package="http://exist-db.org/apps/xsltforms"/>
</package>
请注意,文件名和命名空间中的字符串是“pkg”,但元素名称和依赖项中的属性是“package”。确保将这些内容区分开。
此 XML 文件的格式在 EXPath 文档中描述。
包含 eXist 特定打包说明的示例 repo.xml 文件
<meta xmlns="http://exist-db.org/xquery/repo">
<description>My eXist application</description>
<author>Dan McCreary</author>
<website>http://danmccreary.com</website>
<status>alpha</status>
<license>GNU-LGPL</license>
<copyright>true</copyright>
<!-- set this to "application" (without quotes) for system that have a GUI -->
<type>application</type>
<target>myapp</target>
<prepare>pre-install.xql</prepare>
<finish>post-install.xql</finish>
<permissions user="admin" password="" group="dba" mode="rw-rw-r--"/>
<!-- this element is automatically added by the deployment tool -->
<deployed>2012-11-28T23:15:39.646+01:00</deployed>
</meta>
此 ant 目标需要以下输入
source-dir - the place you keep your source code package-dir - a temp dir such as /tmp/my-package to store temporary files app-name - the name of your application app-version - the version of your application
- 验证 repo.xml 和 expath-package.xml 是否存在于源目录中,并将它们复制到 temp.dir
- 将所有应用程序文件复制到 temp.dir
- 从 temp.dir 中的内容创建 zip 文件,位于 packages 区域,如果需要,将其上传到存储库
<target name="generate-app-xar" description="Generate Application xar archive file">
<echo>Making Package for ${app-name} use source from ${source-dir}</echo>
<zip destfile="${package-dir}/${app-name}-${app-version}.xar">
<fileset dir="${source-dir}">
<include name="**/*.*" />
<exclude name="**/.svn" />
</fileset>
</zip>
<echo>Package is stored at ${package-dir}/${app-name}-${app-version}.xar</echo>
</target>
此脚本依赖于以下 Ant 属性
ant.project.name - the name of the project xslt.dir - the directory that the XSLT script are stored temp.dir - a temp dir such as /tmp to store temporary files web.specs.dir - the place to put the results
<target name="generate-xar" description="Generate xar archive">
<echo>Making ${ant.project.name}.xar...</echo>
<!-- run a transform in the input specification file to create the a.xml file -->
<xslt force="true" style="${xslt.dir}/generate-xar-descriptors.xsl"
in="${web.specs.dir}/${ant.project.name}/${ant.project.name}.xml"
out="${temp.dir}/files/a.xml">
<param name="module-version" expression="${module-version}" />
<param name="eXist-main-class-name" expression="${eXist-main-class-name}" />
</xslt>
<delete file="${temp.dir}/files/a.xml" />
<!-- now create the .xar file with all our files in the right place -->
<zip destfile="${temp.dir}/archives/${ant.project.name}-${module-version}.xar">
<fileset dir="${temp.dir}/files">
<include name="**/*.*" />
<exclude name="*-tests.jar" />
</fileset>
</zip>
</target>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" />
<xsl:param name="module-version" />
<xsl:param name="eXist-main-class-name" />
<xsl:template match="/">
<xsl:variable name="module-namespace">
<xsl:copy-of select="//element()[@id = 'module-namespace']" />
</xsl:variable>
<xsl:variable name="module-prefix">
<xsl:copy-of select="//element()[@id = 'module-prefix']" />
</xsl:variable>
<xsl:variable name="spec-title">
<xsl:copy-of select="concat('EXPath ', //element()[local-name() = 'title'])" />
</xsl:variable>
<xsl:variable name="author">
<xsl:copy-of select="//element()[local-name() = 'author'][1]/element()[1]" />
</xsl:variable>
<xsl:result-document href="target/files/expath-pkg.xml">
<package xmlns="http://expath.org/ns/pkg" name="http://expath.org/lib/{$module-prefix}" abbrev="{concat('expath-', $module-prefix)}"
version="{$module-version}" spec="1.0">
<title>
<xsl:value-of select="$spec-title" />
</title>
<dependency processor="http://exist-db.org/" />
</package>
</xsl:result-document>
<xsl:result-document href="target/files/repo.xml">
<meta xmlns="http://exist-db.org/xquery/repo">
<description>
<xsl:value-of select="$spec-title" />
</description>
<author>
<xsl:value-of select="$author" />
</author>
<website />
<status>stable</status>
<license>GNU-LGPL</license>
<copyright>true</copyright>
<type>library</type>
</meta>
</xsl:result-document>
<xsl:result-document href="target/files/exist.xml">
<package xmlns="http://exist-db.org/ns/expath-pkg">
<jar>
<xsl:value-of select="concat('expath-', $module-prefix, '.jar')" />
</jar>
<java>
<namespace>
<xsl:value-of select="$module-namespace" />
</namespace>
<class>
<xsl:value-of select="concat('org.expath.exist.', $eXist-main-class-name)" />
</class>
</java>
</package>
</xsl:result-document>
<xsl:result-document href="target/files/cxan.xml">
<package xmlns="http://cxan.org/ns/package" id="{concat('expath-', $module-prefix, '-exist')}" name="http://expath.org/lib/{$module-prefix}"
version="{$module-version}">
<author id="{$author/element()/@id}">
<xsl:value-of select="$author" />
</author>
<category id="libs">Libraries</category>
<category id="exist">eXist extensions</category>
<tag>
<xsl:value-of select="$module-prefix" />
</tag>
<tag>expath</tag>
<tag>library</tag>
<tag>exist</tag>
</package>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Apache Ant 目标和 XSLT 脚本由 Claudius Teodorescu 提供。