无Modules Database环境下安装MarkLogic Unit Test遇问题求助
问题背景
使用MarkLogic Unit Test时,原项目模块存放在src/main/ml-modules目录,依赖Modules Database。但新的ml-gradle项目通过本地路径引用xqy文件,不使用Modules Database。添加依赖后执行gradle mlLoadModules时出现错误:
Error occurred while loading REST modules: Error occurred while loading modules; host: localhost; port: 8505; cause: Local message: config/resources write failed: Internal Server Error. Server Message: Server (not a REST instance?) did not respond with an expected REST Error message.
解决方案
MarkLogic Unit Test本身不强制依赖Modules Database,只需调整ml-gradle配置和测试模块引用方式即可适配本地文件场景,具体步骤如下:
1. 禁用REST模块加载任务
mlLoadModules默认行为是向REST实例的Modules Database上传模块,而你的项目无需此操作,直接禁用该任务或跳过REST相关配置:
// 方式1:完全禁用REST端口配置,避免ml-gradle尝试与REST端点交互 mlRestPort = null // 方式2:仅禁用mlLoadModules任务,保留其他REST相关配置(如果有) tasks.mlLoadModules.enabled = false
2. 配置MarkLogic Unit Test的路径
在build.gradle中指定测试模块的存放目录,确保测试框架能定位到测试代码:
mlUnitTest { testModuleDir = file("src/test/ml-modules") // 替换为你的测试模块实际目录 }
3. 调整测试模块的引用路径
测试模块中引用被测试的本地xqy文件时,需使用MarkLogic服务器可访问的路径(绝对路径或服务器能读取的相对路径),同时确保服务器拥有该目录的文件系统访问权限:
import module namespace mymod = "http://example.com/mymod" at "/opt/my-project/src/main/xqy/mymod.xqy";
可通过MarkLogic管理控制台配置file-system-access权限,允许服务器读取目标目录。
4. 直接执行测试任务
无需再运行mlLoadModules,直接执行测试任务:
gradle mlUnitTest
可行性说明
已有大量项目在开发阶段采用本地文件引用 + MarkLogic Unit Test的模式,核心是让ml-gradle跳过模块上传逻辑,同时确保测试模块能正确引用本地代码、服务器有权限访问本地文件。
内容的提问来源于stack exchange,提问作者nobleb

