Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 如何在xquery中访问环境变量?_Maven_Xquery_Marklogic - Fatal编程技术网

Maven 如何在xquery中访问环境变量?

Maven 如何在xquery中访问环境变量?,maven,xquery,marklogic,Maven,Xquery,Marklogic,我在xquery中的程序有几个变量,这些变量基于函数运行的环境。例如,dev指向“devserver”,test指向“testserver”,prod指向“server”,等等 如何在application.xml文件中设置它,以及如何在.xqy函数中引用它们 “变通”解决方案1 使用“开关”确定主机: 这两种解决方案对我来说都不是最好的 不知道MARCORM是否支持它,但是XQuery 3.1的功能有:代码>可用环境变量()/和环境变量()/ 可以考虑在中使用微小的“属性”库。 我们很久很久

我在xquery中的程序有几个变量,这些变量基于函数运行的环境。例如,dev指向“devserver”,test指向“testserver”,prod指向“server”,等等

如何在application.xml文件中设置它,以及如何在.xqy函数中引用它们

“变通”解决方案1 使用“开关”确定主机:

这两种解决方案对我来说都不是最好的


不知道MARCORM是否支持它,但是XQuery 3.1的功能有:代码>可用环境变量()/<代码>和<代码>环境变量()/<代码>

可以考虑在

中使用微小的“属性”库。 我们很久很久以前就为MarkMail.org编写了这篇文章,因为我们相信我们不想将配置放入数据库文档中,因为配置应该与数据分开。数据会在其他地方备份、还原,新位置可能与旧位置不在同一环境中

因此,我们做了一些修改,将config放入静态名称空间上下文(每个组和应用服务器都有这个上下文)。配置的前缀是属性名称。配置的值是属性值(包括类型信息)。下面是一个屏幕截图,从MarkMail部署显示它是一个生产服务器,到发送有关错误的电子邮件,提供什么静态文件版本,以及输出什么域作为其基础

这种方法允许您以管理方式(通过红色GUI或REST)配置属性,并将它们与数据分开。它们对执行上下文静态可用,无需额外成本。您可以在组级别或应用程序服务器级别或两者都配置它们。该库是一个方便的包装器,用于提取类型化的值


也许现在有一种更好的方法,比如XQuery 3.1函数,但这种方法已经运行了10多年。

如果您使用ml gradle部署项目。这意味着您可以使用以下代码设置XQuery库:

declare variable $ENV = "%%environmentName%%";

然后,您可以在任何需要的地方导入该库

在我们的项目中还没有使用gradle,我设法找到了如何使用maven概要文件来根据部署到的环境查找/替换所需的值。我只需要将插件添加到适当的配置文件中,包括要更新的文件以及要替换的内容

pom.xml:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>replacer</artifactId>
  <version>1.5.2</version>
  <executions>
    <execution>
      <phase>prepare-package</phase>
      <goals>
        <goal>replace</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <includes>
      <include>**/modules/runTasks.xqy</include>
      <include>**/imports/resetKey.xqy</include>
    </includes>
    <replacements>
      <replacement>
        <token>https://stage.mydime.org/api/Services</token>
        <value>https://www.mydime.org/api/Services</value>
      </replacement>
    </replacements>
  </configuration>
</plugin>

com.google.code.maven-replacer-plugin
替代者
1.5.2
准备包装
代替
**/模块/runTasks.xqy
**/导入/resetKey.xqy
https://stage.mydime.org/api/Services
https://www.mydime.org/api/Services

MarkLogic不支持这些方法,但请记住,MarkLogic数据库可以跨多台主机群集。依赖环境设置可能很脆弱。我建议使用保存在MarkLogic中的设置。是的,我们就如何指定环境变量进行了一些讨论,因为环境变量往往是流程的本地变量。在文档中存储配置可能是好的,也可能是坏的。这取决于具体情况,如存储的设置类型。请记住,在创建第二个环境的克隆过程中可能会包含配置,这是评估是否需要额外措施的好方法。这是MarkLogic中非常常见的方法,也适用于服务器端JavaScript文件。我们还没有使用ml gradle,但是同样的事情应该适用于Maven和Anthill,不是吗?它通过在部署之前在源代码中进行字符串替换来工作,所以是的,您应该能够使用其他工具来完成。(但我强烈鼓励使用ml gradle,因为它被广泛使用并积极工作。)我会尽量避免让它成为特定于主机的。MarkLogic是一种群集解决方案,因此您在扩展或将群集迁移到不同的硬件或vm软件时会遇到麻烦。
declare variable $ENV = "%%environmentName%%";
<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>replacer</artifactId>
  <version>1.5.2</version>
  <executions>
    <execution>
      <phase>prepare-package</phase>
      <goals>
        <goal>replace</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <includes>
      <include>**/modules/runTasks.xqy</include>
      <include>**/imports/resetKey.xqy</include>
    </includes>
    <replacements>
      <replacement>
        <token>https://stage.mydime.org/api/Services</token>
        <value>https://www.mydime.org/api/Services</value>
      </replacement>
    </replacements>
  </configuration>
</plugin>