将 JDBC 驱动程序从私有安全 Maven 存储库安装到 Wildfly Swarm

Installing a JDBC driver from a private secured maven repo into Wildfly Swarm

我正在尝试使用 Java 配置 API 将 Oracle JDBC 驱动程序安装到 Wildfly Swarm (2016.12.0) 中。驱动程序 jar 已正确安装在远程、私有、安全的 maven 存储库中。我基本上是按照这里的例子:

https://github.com/wildfly-swarm/wildfly-swarm-examples/tree/master/datasource/datasource-subsystem

我的项目中有一个 src/main/resources/modules/com/oracle/ojdbc/main 目录,其中包含以下 module.xml 文件:

<module xmlns="urn:jboss:module:1.3" name="com.oracle.ojdbc">

    <resources>
        <artifact name="my.repo.group.id:ojdbc6:11.2.0.1.0"/>    
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

这是我正在使用的配置代码片段:

Swarm swarm = new Swarm();

DatasourcesFraction datasources = new DatasourcesFraction().jdbcDriver("oracle-ojdbc-xa", (d) -> {
    d.xaDatasourceClass("oracle.jdbc.xa.client.OracleXADataSource");
    d.driverModuleName("com.oracle.ojdbc");
});

swarm.fraction(datasources);
swarm.start();
swarm.deploy();

这是我得到的异常:

2016-12-17 13:25:49,138 ERROR [stderr] (ServerService Thread Pool -- 28) org.jboss.modules.ModuleLoadException: Error loading module from modules/com/oracle/ojdbc/main/module.xml
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseModuleXml(ModuleXmlParser.java:228)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.wildfly.swarm.bootstrap.modules.BootstrapClasspathModuleFinder.findModule(BootstrapClasspathModuleFinder.java:58)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.ModuleLoader.findModule(ModuleLoader.java:439)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.ModuleLoader.loadModuleLocal(ModuleLoader.java:342)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.ModuleLoader.preloadModule(ModuleLoader.java:289)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:221)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.connector.subsystems.datasources.JdbcDriverAdd.performRuntime(JdbcDriverAdd.java:98)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.AbstractAddStepHandler.performRuntime(AbstractAddStepHandler.java:337)
[0m[31m2016-12-17 13:25:49,139 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.AbstractAddStepHandler.execute(AbstractAddStepHandler.java:151)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:890)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:659)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:370)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.as.controller.ParallelBootOperationStepHandler$ParallelBootTask.run(ParallelBootOperationStepHandler.java:359)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at java.lang.Thread.run(Thread.java:745)
[0m[31m2016-12-17 13:25:49,140 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.threads.JBossThread.run(JBossThread.java:320)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28) Caused by: org.jboss.modules.xml.XmlPullParserException: Failed to resolve artifact 'my.repo.group.id:ojdbc6:11.2.0.1.0' (position: END_TAG seen ... name="my.repo.group.id:ojdbc6:11.2.0.1.0"/>... @6:81) 
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseArtifact(ModuleXmlParser.java:838)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseResources(ModuleXmlParser.java:739)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseModuleContents(ModuleXmlParser.java:535)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseDocument(ModuleXmlParser.java:340)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     at org.jboss.modules.xml.ModuleXmlParser.parseModuleXml(ModuleXmlParser.java:226)
[0m[31m2016-12-17 13:25:49,141 ERROR [stderr] (ServerService Thread Pool -- 28)     ... 16 more

我已经能够确认示例代码在 wildfly-swarm 项目中有效,所以我确信我的项目中没有网络、配置或明显的 maven 依赖问题;例如,我可以让它与 mysql 驱动程序一起正常工作,它安装时没有明显问题。我也确信我在访问我的私人 Maven 仓库时没有问题 - settings.xml 和 security-settings.xml 已为此项目和其他项目正确配置,并且此驱动程序工件已正确安装在我的本地存储库。

任何见解都将不胜感激 - 我想我要么错过了一些非常愚蠢的东西,要么我正在尝试做一些不受支持的事情。有趣的是,如果我手动将资源节点从本地 Maven 存储库复制到我看来是临时项目构建存储库的位置(路径很奇怪,它是 <project root>/? ~/repository?/.m2 是的,该路径包括问号、空格和波浪号) 部署有效。

我认为这是一个问题,因为 Maven 的安全设置没有被用于检索工件,这就是找不到它的原因。

话虽如此,自 2016.12.0 以来,有一种无需编写 module.xml 即可配置 JDBC 驱动程序的更简单方法。看看 https://howto.wildfly-swarm.io/create-a-datasource/,它解释了如何只添加 JDBC 驱动程序的 Maven 依赖项,然后使用 yml

配置它

原来我是想做一些愚蠢的事情不受支持。

我的 settings.xml 本地存储库配置如下所示(我在 OSX 10.12):

<localRepository>
    /Users/rekgm/.m2/repository
</localRepository>

MavenSettings.java doesn't strip out the whitespace, so the MavenResolver that the WF Swarm bootstrap module uses couldn't properly figure out where the local maven repo lives so it would try and redownload the artifact from a remote maven repo. This works great for artifacts that live in unsecured remote repos, but MavenArtifactUtil.downloadFile() 不明白可以保护远程仓库。因此我得到了错误。

我将 settings.xml 文件更改为:

<localRepository>/Users/rekgm/.m2/repository</localRepository>

并在主项目中添加了Oracle依赖pom.xml:

<dependencies>
    ...
    <dependency>
        <groupId>my.repo.group.id</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
    </dependency>
    ...
</dependencies>

这就清除了错误。我可能会在某个时候提交错误和功能请求。