跳转到内容

Apache Ant/创建 .xar 文件

来自 Wikibooks,开放世界中的开放书籍

这个例子正在开发中!

您想直接从您的源代码中创建一个 XML 归档文件(.xar 文件),该文件可用于将库模块或应用程序加载到本机 XML 数据库中。这使得用户更容易安装您的模块或应用程序。打包过程会将您的文件上传到正在运行的 eXist 服务器上的正确位置,并自动设置所有 XQuery 文件(.xq)的权限。

我们需要创建一个包含所有正确组件的“zip”文件。

包的格式如下

http://expath.org/spec/pkg

eXist 特定包文档位于此处

http://demo.exist-db.org/exist/apps/doc/repo.xml

GUI 包 vs. 磁盘库 vs. 数据库库

[编辑 | 编辑源代码]

有三种类型的安装包

  1. 不在数据库中的外部库
  2. 加载到数据库中的库
  3. 具有 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>

生成应用程序 .xar 文件的示例 Apache Ant 目标

[编辑 | 编辑源代码]

此 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
  1. 验证 repo.xml 和 expath-package.xml 是否存在于源目录中,并将它们复制到 temp.dir
  2. 将所有应用程序文件复制到 temp.dir
  3. 从 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>

生成库 .xar 文件的示例 Apache Ant 目标

[编辑 | 编辑源代码]

此脚本依赖于以下 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>

示例 XSLT 脚本

[编辑 | 编辑源代码]
<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>

示例 XQuery 脚本

[编辑 | 编辑源代码]

Apache Ant 目标和 XSLT 脚本由 Claudius Teodorescu 提供。

华夏公益教科书