Digital Service Signature (DSS) 项目编译失败技术咨询
运行环境
- JDK: Temurin OpenJDK 1.8.0_322(64位Server VM,混合模式)
- 开发工具: Visual Studio Code 1.68.1,集成Docker Container插件v4.6.1
- 操作系统: Mac OS 11.6 Big Sur
问题现象
主仓库编译失败
编译sd-dss主仓库时抛出两类错误:
- 依赖解析失败,本地缓存了Maven中央仓库找不到对应内部模块的失败记录,不会自动重试拉取
- maven-site-plugin执行run目标时触发空指针异常
错误日志如下:
Unable to build dependency tree. Could not resolve following dependencies: [eu.europa.ec.joinup.sd-dss:dss-document:jar:5.10.1 Could not resolve dependencies for project eu.europa.ec.joinup.sd-dss:dss-test:jar:5.10.1 The following artifacts could not be resolved: eu.europa.ec.joinup.sd-dss:dss-document:jar:5.10.1, eu.europa.ec.joinup.sd-dss:dss-token:jar:5.10.1, eu.europa.ec.joinup.sd-dss:dss-service:jar:5.10.1, eu.europa.ec.joinup.sd-dss:dss-utils-apache-commons:jar:5.10.1, eu.europa.ec.joinup.sd-dss:dss-crl-parser-stream:jar:5.10.1: eu.europa.ec.joinup.sd-dss:dss-document:jar:5.10.1 was not found in https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.10.0:run (default-cli) on project dss-test: Execution default-cli of goal org.apache.maven.plugins:maven-site-plugin:3.10.0:run failed.: NullPointerException -> [Help 1]
演示仓库运行失败
修复演示仓库pom配置问题后,启动应用抛出JavaFX组件缺失错误:
Error: JavaFX runtime components are missing, and are required to run this application
排查思路与解决方案
主仓库依赖解析+插件报错问题
这个错误核心是构建顺序错误:dss是多模块Maven项目,dss-document、dss-token、dss-service这些都是项目自带的内部模块,不会发布到Maven中央仓库。单独编译dss-test子模块时,Maven找不到本地已安装的对应版本内部模块,就会去中央仓库拉取,自然拉取失败,且失败记录会被缓存到本地仓库,默认不会重试。maven-site-plugin的空指针是插件3.10.0版本和当前环境的兼容问题,普通开发构建不需要生成项目站点文档,直接跳过即可。
按以下步骤处理:
- 先清理本地Maven仓库缓存的失败记录,直接删除本地Maven仓库路径下
eu/europa/ec/joinup/sd-dss整个目录即可,也可以执行命令定向清理:mvn dependency:purge-local-repository -DmanualInclude="eu.europa.ec.joinup.sd-dss:dss-document,eu.europa.ec.joinup.sd-dss:dss-token,eu.europa.ec.joinup.sd-dss:dss-service,eu.europa.ec.joinup.sd-dss:dss-utils-apache-commons,eu.europa.ec.joinup.sd-dss:dss-crl-parser-stream" - 回到仓库根目录执行全量构建安装,把所有内部模块安装到本地Maven仓库,同时跳过site插件执行和测试用例,加快构建速度:
mvn clean install -DskipTests -Dmaven.site.skip=true - 后续如果需要单独编译子模块,构建时加上
-am(also-make)参数,Maven会自动构建当前模块依赖的其他内部模块,不需要每次都全量安装:mvn clean package -pl dss-test -am -DskipTests
演示仓库JavaFX缺失问题
报错原因是你使用的Temurin OpenJDK 8u322属于精简版,从8u202之后的OpenJDK构建版本就已经移除了内置的JavaFX组件,而演示仓库中部分GUI示例依赖JavaFX运行时。另外注意Docker容器默认是无头(headless)环境,没有图形显示服务,无特殊需求不建议在容器内运行GUI类程序。
按以下方案按需选择:
- 无GUI需求的话,直接跳过JavaFX相关的demo模块,运行命令行、服务端类的示例即可,不需要额外处理JavaFX问题。
- 需要运行JavaFX示例时,二选一即可:
- 替换当前JDK为自带JavaFX组件的Zulu JDK 8 FX版本,安装后直接构建运行,不需要额外修改依赖配置。
- 保留当前OpenJDK,在对应JavaFX demo模块的pom.xml中引入匹配版本的JavaFX依赖:
启动时不要直接用<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>8.0.322</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>8.0.322</version> </dependency>java -jar方式启动,通过maven exec插件指定JavaFX启动类,或在启动参数中指定JavaFX模块路径即可。如果必须在Docker容器内运行,需要额外安装xvfb虚拟显示服务提供图形环境支持。
内容的提问来源于stack exchange,提问作者Bogdan Gaytan Martin
相关产品推荐
相关产品推荐

