我喜好新玩具。我真的很喜好那些经由验证的技能栈里的新玩具。我非常喜好那些能让我玩到经由产品验证的新技能的新玩具。而工具玩具是个中最好的。
在本文中,我将谈论两个新玩具。如果一起利用,它们很可能成为你软件开拓之战中的必备之箭。这两个工具分别是来自 WildFly 项目的 wildfly-jar-maven-plugin 和全新的 wildfly-datasources-preview-galleon-pack。
WildFly 是 RedHat 公司 JBoss 运用做事器的一个上游项目,对付许多项目来说,都是一个很好的办理方案。该运用做事器兼容 Jakarta EE 8,最新的“预览”版本则兼容 Jakarta EE 9.1。

2022 年WildFly的发布操持包括为即将发布的 Jakarta 10 做准备,通过未来的一个“预览”版本,让开发者就可以把下一个版本的标准拿来玩。真令人激动。
现在,我们将重点谈论 WildFly 26.0.1 预览版(已在一月的末了一周发布)和 Jakarta EE 9.1。
第一个新玩具wildfly-jar-maven-plugin 许可开拓者按需配置(确定运用程序须要运用做事器的哪些部分、依赖或能力,并进行任何必要的配置)WildFly 做事器,并利用 Maven 天生包含运用程序和 WildFly 容器的 Uber JAR。没错,全体运用做事器和运用程序都被打包在一个整洁的 JAR 文件中。实行命令:
java -jar nameOfYourApplication-bootable.jar
复制代码
做事器和运用程序就准备好了。把那个可启动的 JAR 文件放到局域网的做事器上,支配到边缘设备上,支配到容器化环境中,当然要放到目标目录中。它仍旧供应了标准的 WAR 文件,你可以把它支配在裸机或虚拟机上运行的 Jakarta EE 容器中。这里有很多选项和一大堆配置事情,但这个插件可以帮我们在短韶光内完成。这个插件彷佛是在 2020 年被推送到 Maven 仓库的,最新版本 7.0.0.Final 是几个月前推送的。从 Maven 仓库的发布频率来看,该插件显然得到了积极的掩护。
如上所述,运用做事器和运用程序紧密地捆绑在一起,你很随意马虎就可以得到一个大略的 Docker 文件,做好在 Kubernetes 上支配的准备。将插件添加到 Maven 的 pom.xml 中,如下所示:
<plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-jar-maven-plugin</artifactId> <version>${version.wildfly.jar.maven.plugin}</version> <configuration> <log-time>true</log-time> <cloud> <type>kubernetes</type> </cloud> <context-root>false</context-root> <feature-packs> <feature-pack> <location>wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly} </location> </feature-pack> <feature-pack> <groupId>org.wildfly</groupId> <artifactId>wildfly-datasources-galleon-pack</artifactId> <version>${version.wildfly.datasources.galleon-pack}</version> </feature-pack> </feature-packs> <hollow-jar>false</hollow-jar> <plugin-options> <jboss-fork-embedded>true</jboss-fork-embedded> </plugin-options> <!-- Listen on all ports --> <arguments> <argument>-b=0.0.0.0</argument> </arguments> <!-- Make sure we can debug --> <jvmArguments> <arg>-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n</arg> </jvmArguments> <cli-sessions> <cli-session> <!-- Feed WildFly Some Properties --> <properties-file>package_properties.properties</properties-file> <!-- Run some jboss-cli.sh commands against WildFly --> <script-files> <script>package_script.cli</script> </script-files> </cli-session> </cli-sessions> <excluded-layers> <!-- Just here to demonstrate one can take layers OUT of the Container --> <layer>core-management</layer> <layer>deployment-scanner</layer> <layer>jmx-remoting</layer> <layer>request-controller</layer> <layer>security-manager</layer> </excluded-layers> <layers> <!-- Some of these layers are redundant as Galleon dependencies take's care of most things --> <layer>cloud-server</layer> <layer>ejb-dist-cache</layer> <layer>web-clustering</layer> <layer>ee</layer> <layer>ejb-lite</layer> <layer>jaxrs</layer> <layer>jpa</layer> <layer>jsf</layer> <layer>jsonb</layer> <layer>jsonp</layer> <!-- These go along with wildfly-datasources-preview-galleon-pack --> <layer>datasources-web-server</layer> <layer>postgresql-datasource</layer> <!-- Yes, there are other drivers available --> </layers> </configuration> <executions> <execution> <goals> <goal>package</goal> </goals> </execution> </executions></plugin>
复制代码
这里有构建可启动 JAR 文件的完全文档。为了让你能够快速上手,我在 GitHub 上发布了一些示例代码。克隆这个资源库,然后实行命令:
mvn cleanmvn wildfly-jar:dev-watch
复制代码
第二个新玩具现在,我们已经先容完了第一个新玩具,让我们拿 WildFly 的“预览”版来试一试。首先,我们将更新“功能包”的位置,从:
<location>wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly}</location>
复制代码
改为:
<location>wildfly-preview@maven(org.jboss.universe:community-universe)#${version.wildfly}</location>
复制代码
我们还必须改变全新的 wildfly-datasources-preview-galleon-pack 的 artifactId,以便运用程序能够连接到数据库。毕竟,没有数据的运用程序什么都不是?从:
<artifactId>wildfly-datasources-galleon-pack</artifactId>
复制代码
改为:
<artifactId>wildfly-datasources-preview-galleon-pack</artifactId>
复制代码
WildFly extras(WildFly Java 社区附加资源库)的掩护者值得夸奖,由于他们供应的这个东西确实是一个很好的补充。对付利用 WildFly“预览”版考试测验数据库驱动运用程序开拓来说,它是必不可少的。它是在 2022 年 2 月的第一个周被推送到 Maven 的。实行命令:
mvn wildfly-jar:dev-watch
复制代码
现在可以开始运行了。wildfly-jar-maven-plugin 会在你保存文件的同时对代码进行监控和支配。有了 wildfly-datasources-preview-galleon-pack,连接数据库就变得非常大略了。这非常好。大多数 IDE 都许可通过 Maven GUI 控件实行“mvn maven wildfly-jar:dev-watch”。下面是 IntelliJ IDEA 中 Maven 控件的截图,个中包括我们在 pom.xml 中配置的 wildfly-jar-maven-plugin。
就像在命令行中实行“mvn maven wildfly-jar:dev-watch”一样,IDE 将显示构建、启动和配置示例运用程序的过程信息:
在示例运用程序的持久化单元配置中,有一个 jakarta.persistence.sql-load-script-source 属性,它引用了位于运用程序 META-INF 目录中的 my_jpa_data_table.sql 文件。该 SQL 文件被用来向示例运用程序所利用的数据库表插入一些占位记录。启动示例运用程序后,对 PostgreSQL 中的 my_jpa_data_table 表实行一条 SELECT 命令。如下所示,这是将示例运用程序指向数据库做事器并利用本文中的工具启动后,你将看到的情形:
而且,如果想证明该示例运用程序可以完备实现数据来回,则可以启动一个浏览器来显示运用程序中的数据:
如果你想看看这些工具如何加快运用程序开拓,让“mvn maven wildfly-jar:dev-watch”命令保持运行,编辑示例运用中的 index.xhtml 文件并保存。你会看到运用程序迅速重新支配,你的改动立即就反响在了 Web 浏览器上。不仅是在运用程序的用户界面层面,在数据库以上的每一个层面上都是如此。
超酷的玩具。
如果你通过 wildfly-jar-maven-plugin 试用 wildfly-preview 和 wildfly-datasources-preview-galleon-pack,那么这里有几个小提示:
“layers”配置处理你可能须要的来自 WildFly 的任何依赖。如果要进行容器化,则可以直接添加“cloud-server”层和“postgresql-datasource”或其他与数据库相匹配的数据源层。如果不须要某些 “layers”,则可以把它们打消在外,从而为 Uber JAR 瘦身。我在插件配置中打消了一些,只是为了展示 wildfly-jar-maven-plugin 的这种能力。检讨一下可用的层,根据自己的需求确定哪些是可选的或非必要的。你须要将运用程序中的 javax 命名空间更新为 jakarta。WildFly 的常规版本既许可利用比较旧的 javax 命名空间,大概可利用比较新的 jakarta 命名空间,但预览版把重点放在了 Jakarta EE 上,以是你在 Java 源代码中须要一贯利用 import jakarta.。如果这适用于你的项目,那么 web.xml文件也应如此。请记住,这是一个预览版,以是在生产中最好还是利用常规版本。主要提示!
你会把稳到,我们没有在任何地方定义运用程序可以在哪里找到数据库做事器以及个中的数据库。wildfly-datasources-preview-galleon-pack 将从环境变量中读取这些信息。现在,你也可以在 WildFly 内部设置,但在实践中,我推举利用环境变量。这有利于运用做事器/运用程序 Uber JAR 的容器化。以下是在 Linux 上配置数据库环境变量的例子:
export POSTGRESQL_HOST=server.withyourdatabase.comexport POSTGRESQL_PORT=5432export POSTGRESQL_DATABASE=quickDbexport POSTGRESQL_USER=yourUsernameexport POSTGRESQL_PASSWORD=yourSecretPassword
复制代码
其余,在 IDE 中配置数据库环境变量的例子:
在碰着这个插件,并在 WildFly 社区的帮助下利用预览版连接到数据库后,我很快就离不开这个工具组合了。我责备自己:“我怎么会错过这个?”而且,这些 Galleon“功能包”和 wildfly-jar-maven-plugin 为开拓者供应了非常好的体验,让人乐在个中。这一点在 mvn wildfly-jar:dev-watch 上表现得尤为明显!
此外,在处于生动开拓状态时,“mvn wildfly-jar:dev-watch”还是很有用的,它让开发者可以得到一个可感知数据库的 JAR,具有 WildFly 固有的所有功能,可以随时支配。有了这个插件,这个过程就很大略了,只要发出命令:
mvn clean package wildfly-jar:package
复制代码
真是超酷的工具!
利用 wildfly-jar-maven-plugin,可以办理基本的运用程序配置问题。你将看到,在示例代码中,有几个(险些是)空文件,可以用来添加运用程序环境变量,并发出一些额外的配置命令,以完成 WildFly 的设置。
从 package_script.cli 文件可以看到,我添加了下面这行配置:
/system-property=somePropertyName:add(value=somePropertyValue)
复制代码
它将属性“somePropertyName”设置为“somePropertyValue”。厥后果和在命令行上发出下面这行命令一样:
${JBOSS_HOME}/bin/jboss-cli.sh /system-property=somePropertyName:add(value=somePropertyValue)
复制代码
在示例代码中,插件引用的 package_script.cli 和 package_properties.properties 文件,彷佛足以知足大多数运用做事器配置需求。只管如此,对付它们供应的这种灵巧性,有一些配置任务的最佳做法我还不愿定。不是说没有办法办理这些配置问题,但仍旧须要制订个操持。
例如,须要保持凭据安全的情形。如果运用程序要进入Kubernetes环境,那么你可能会利用像Bitnami Sealed Secrets或HashiCorp Vault这样的东西来应对这个寻衅。在你的事情站上,或者是在你能掌握操作环境的做事器上,运用程序可以引用这个环境。
但是,如果最适宜运用程序的做法是在 WildFly 容器内存储这些凭据呢?WildFly 包含一个精良的安全子系统Elytron,以是利用该工具将是一个很自然的选择。你该当考虑在 WildFly 内部借助 Elytron 存储凭据的功能。
在事情站或做事器上,你可以利用${JBOSS_HOME}/bin/jboss-cli.sh命令添加一个“secret-key-redential-store”。这一系列的命令可能是下面这样:
history --disable/subsystem=elytron/secret-key-credential-store=secret-key-credential-store:add(relative-to=jboss.server.config.dir, path=secretKeyCredentialStore.cs)/subsystem=elytron/secret-key-credential-store=secret-key-credential-store:export-secret-key(alias=key)/subsystem=elytron/expression=encryption:add(resolvers=[{name=secret-key-resolver, credential-store=secret-key-credential-store, secret-key=key}])
复制代码
到目前为止,统统顺利。但是,这个“确保 WildFly 内部凭据安全”配置任务的第一只拦路虎现在涌现了。你须要发出以下两个命令,为第一个命令的明文密码(输入)创建一个表达式,并将该命令的输出添加到“凭据库”中,这两个命令是从属关系:
/subsystem=elytron/expression=encryption:create-expression(resolver=secret-key-resolver, clear-text=passwordThatNoOneWillEverGuess)/subsystem=elytron/credential-store=credential-store:add(relative-to=jboss.server.config.dir, path=credentialStoreCandela.cs, credential-reference={clear-text= OUTPUT_OF_PREVIOUS_COMMAND_AS_INPUT_HERE }, create=true)
复制代码
在终端窗口中,将一个命令的输出链接到另一个命令非常大略。或者在最坏的情形下,这是一个偶尔实行的系统管理任务,你只需将第一个命令中的表达式剪切并粘贴到第二个命令中。这项任务接下来的事情也相称大略,你只须要发出:
/subsystem=elytron/credential-store=credential-store:generate-secret-key(alias=key)/subsystem=elytron/expression=encryption:list-add(name=resolvers, value={name=resolver, credential-store=credential-store, secret-key=key})reload/subsystem=elytron/expression=encryption:write-attribute(name=default-resolver, value=resolver)reload/subsystem=elytron/expression=encryption:create-expression(clear-text=passwordThatNoOneWillEverGuess)history --enable/subsystem=elytron/credential-store=credential-store:add-alias(alias=MyFirstCredential, secret-value=doNotShareThis)/subsystem=elytron/credential-store=credential-store:add-alias(alias=MySecondCredential, secret-value=AlsoDoNotShareThis)/subsystem=elytron/secret-key-credential-store=secret-key-credential-store:read-aliases/subsystem=elytron/credential-store=credential-store:read-aliases
复制代码
上面的“reload”命令是完成任务所必需的,在事情站或做事器上都不是问题。通过“mvn wildfly-jar:watch-dev”和“mvn clean package wildfly-jar:package”命令即时完成这项任务则有所不同。由这些工具实行的即时配置并不会指示运用做事看重新读取及重新加载其主配置文件,而在这个特定的配置任务中,这是一个必要的步骤。是否有什么方法可以处理这样一个稍显繁芜的配置?当然有。大概只需在选定的 Maven 阶段复制一个配置文件和适当的支持文件。也容许以在 package_script.cli 和 package_properties.properties 中加入特定内容,看看能走多远。
若何做最好?鉴于利用 wildfly-jar-maven-plugin 的韶光相对还比较短,我还不能确定。我的初步想法是,wildfly-preview-datasources-galleon-pack 非常灵巧,也容许以创建一个 “wildfly-credential-store-galleon-pack”或类似的新工具工件,用于应对这一特定情形。也容许以把 galleon-pack 加入到插件配置中,由它读取一大堆环境变量(大概有预定义的命名规则?),或者是从安全地存储在开拓事情站上运用程序存储库之外的属性文件中读取。这将使你能够将这些凭据安全地加载到 Elytron 中,就像 wildfly-preview-datasources-galleon-pack 实时处理数据库连接一样。
同样,我只是选择了在 WildFly 内部确保凭据安全这样一个场景,如果你要利用这个插件,就须要额外做些操持。我相信,如果你把运用程序打包在一个可启动的 JAR 中,那么你可以根据自己的支配需求想象出其他配置任务。
需求永无止境这真是太酷了。你还想要什么呢?我很高兴你这么问,由于如果我不想要更多,那我还算什么终端用户?
我想利用Eclipse Vert.x驱动连接数据库,并希望这些驱动能够进入 wildfly-datasources-preview-galleon-pack 中。这个欲望得以实现的条件是,新版本的 Hibernate(WildFly 的JPA和 ORM 实现)以及 Hibernate Reactive 发布。Hibernate 网站显示,那将是 5.6 版本。Hibernate 5.3 打包了 wildfly-preview。如果Hibernate ORM 6在Jakarta EE 10之前达到稳定状态,这大概就不是问题了。从Quarkus这样的项目中可以看到 Hibernate Reactive 带来的好处,我很想看到 WildFly 中也供应这些功能,只要这些新增功能不违反 Jakarta EE 标准。这该当不是问题,由于该标准常日不排斥运用做事器和/或工具供应商供应“更多”的特性。
还有一个WildFly MicroProfile Reactive Feature Pack,但不像 Panache,我在那个项目库中没有看到任何对 Hibernate Reactive 的详细引用。
结语这些不仅仅是新玩具,而且是有用的工具。如果你正在为开拓数据库驱动的运用程序理解 wildfly-preview,那么不妨试一试 wildfly-jar-maven-plugin 和 wildfly-datasources-preview-galleon-pack。
我在 GitHub 上发布了一个小的示例项目,如果你想快速试用一下这个新工具组合,那么可以从这里入手。个中包括前面提到的那个大略的 Docker 文件,还有一个 Kubernetes YAML 文件示例。该示例代码中有一个参考 SQL 文件,可以配置 JPA 持久化单元和 JPA 工具。如果你向表中添补了数据,还有一个 JSF 页面可以把它们显示出来。wildfly-datasources-preview-galleon-pack 使可启动 JAR 包能够感知数据库,你只需付出很少的努力(只需设置环境变量以指向你的数据库),就可以让示例运用程序获取并显示数据。
干系资源Jakarta EE确实是 Java 生态系统的重心。如果你没有通过一个或多个实现全体标准的运用做事器(如 WildFly)直策应用它,那么你也很可能在间接地利用它的一个库,由生态系统中其他 Java 项目供应的实现。本文谈论的工具将使利用 Jakarta EE 和 WildFly 成为一种特殊愉快的经历。在 Java 和 Jakarta EE 领域有许多了不起的事情发生,这个领域的活动彷佛只会加速。要想不错过一些能真正提高生产力,改进这一基本标准的利用体验的东西,可能是一个不小的寻衅。除了Eclipse基金会(Jakarta EE 的管理机构)之外,Jakarta EE Ambassadors也是一个很棒的社区和开拓者资源。这是一个很好的办法,让你可以理解 Jakarta EE 本身及周边的情形。如果你还不是社区成员,那么还请考虑加入 Jakarta EE Ambassadors,以此为路子参与到这一部分 Java 生态系统。
再次感谢wildfly-extras团队。WildFly项目供应了许多好工具,可不止这里谈论的这两个。这些工具中的每一个都增加了利用Jakarta EE和 WildFly 开拓运用程序的乐趣!
作者简介:
Dennis Gesker是一位履历丰富的 Java 开拓职员,也是Jakarta EE Ambassadors的成员。他目前正致力于Candela Global项目。这是一个社交媒体金融科技项目,将于今年晚些时候推出。
理解更多软件开拓与干系领域知识,点击访问 InfoQ 官网:https://www.infoq.cn/,获取更多精彩内容!