我喜欢新玩具。我真的很喜欢这些经过验证的技术栈里的新玩具。我特别喜欢这些能让我玩到经过产品验证的新技术的新玩具。而工具玩具是其中最好的。
在本文中,我将讨论两个新玩具。假如一起使用,它们很可能成为你软件开发之战中的必备之箭。这两个工具分别是来自WildFly项目的wildfly-jar-maven-plugin和全新的wildfly-datasources-preview-galleon-pack。
WildFly是RedHat公司JBoss应用服务器的一个上游项目,对于许多项目来说,都是一个挺好的解决方案。该应用服务器兼容JakartaEE8,最新的“预览”版本则兼容JakartaEE9.1。
2022年WildFly的发布计划包括为正式发布的Jakarta10做打算,通过未来的一个“预览”版本,让开发者就可以把下一个版本的标准用来玩。真令人兴奋。
如今,我们将重点讨论WildFly26.0.1预览版(已在三月的最后一周发布)和JakartaEE9.1。
第一个新玩具
wildfly-jar-maven-plugin容许开发者按需配置(确定应用程序须要应用服务器的什么部份、依赖或能力,并进行任何必要的配置)WildFly服务器,并使用Maven生成包含应用程序和WildFly容器的UberJAR。没错,整个应用服务器和应用程序都被打包在一个整洁的JAR文件中。执行命令:
java -jar nameOfYourApplication-bootable.jar
复制代码
服务器和应用程序就打算好了。把那种可启动的JAR文件放在局域网的服务器上,布署到边沿设备上,布署到容器化环境中,其实要放在目标目录中。它一直提供了标准的WAR文件,你可以把它布署在裸机或虚拟机上运行的JakartaEE容器中。这儿有很多选项和一大堆配置工作,但这个插件可以帮我们在短时间内完成。这个插件似乎是在2020年被推送到Maven库房的,最新版本7.0.0.Final是几个月前推送的。从Maven库房的发布频度来看,该插件似乎得到了积极的维护。
如上所述,应用服务器和应用程序紧密地捆绑在一起,你很容易就可以得到一个简单的Docker文件,做好在Kubernetes上布署的打算。将插件添加到Maven的pom.xml中,如下所示:
org.wildfly.plugins
**wildfly-jar-maven-plugin**
${version.wildfly.jar.maven.plugin}
true
kubernetes
false
wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly}
org.wildfly
wildfly-datasources-galleon-pack
${version.wildfly.datasources.galleon-pack}
false
true
-b=0.0.0.0
-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n
package_properties.properties
package_script.cli
core-management
deployment-scanner
jmx-remoting
request-controller
security-manager
cloud-server
ejb-dist-cache
web-clustering
ee
ejb-lite
jaxrs
jpa
jsf
jsonb
jsonp
datasources-web-server
postgresql-datasource
package
复制代码
这儿有建立可启动JAR文件的完整文档。为了让你就能快速上手,我在GitHub上发布了一些示例代码。克隆这个资源库,之后执行命令:
mvn clean
mvn wildfly-jar:dev-watch
复制代码
第二个新玩具
如今,我们早已介绍完了第一个新玩具,让我们拿WildFly的“预览”版来试一试。首先linux查看端口占用,我们将更新“功能包”的位置,从:
wildfly@maven(org.jboss.universe:community-universe)#${version.wildfly}
复制代码
改为:
wildfly-preview@maven(org.jboss.universe:community-universe)#${version.wildfly}
复制代码
我们还必须改变全新的wildfly-datasources-preview-galleon-pack的artifactId,便于应用程序才能联接到数据库。虽然,没有数据的应用程序哪些都不是?从:
wildfly-datasources-galleon-pack
复制代码
改为:
wildfly-datasources-preview-galleon-pack
复制代码
WildFlyextras(WildFlyJava社区附加资源库)的维护者值得赞许,由于她们提供的这个东西确实是一个挺好的补充。对于使用WildFly“预览”版尝试数据库驱动应用程序开发来说,它是必不可少的。它是在2022年2月的第一个周被推送到Maven的。执行命令:
mvn wildfly-jar:dev-watch
复制代码
如今可以开始运行了。wildfly-jar-maven-plugin会在你保存文件的同时对代码进行监控和布署。有了wildfly-datasources-preview-galleon-pack,联接数据库就显得十分简单了。这特别好。大多数IDE都容许通过MavenGUI控件执行“mvnmavenwildfly-jar:dev-watch”。下边是IntelliJIDEA中Maven控件的截图,其中包括我们在pom.xml中配置的wildfly-jar-maven-plugin。
如同在命令行中执行“mvnmavenwildfly-jar:dev-watch”一样,IDE将显示建立、启动和配置示例应用程序的过程信息:
在示例应用程序的持久化单元配置中,有一个jakarta.persistence.sql-load-script-source属性linux关机命令,它引用了坐落应用程序META-INF目录中的my_jpa_data_table.sql文件。该SQL文件被拿来向示例应用程序所使用的数据库表插入一些占位记录。启动示例应用程序后,对PostgreSQL中的my_jpa_data_table表执行一条SELECT命令。如下所示,这是将示例应用程序指向数据库服务器并使用本文中的工具启动后,你将见到的情况:
并且,假如想证明该示例应用程序可以完全实现数据往返,则可以启动一个浏览器来显示应用程序中的数据:
假如你想瞧瞧这种工具怎么推进应用程序开发,让“mvnmavenwildfly-jar:dev-watch”命令保持运行,编辑示例应用中的index.xhtml文件并保存。你会看见应用程序迅速重新布署,你的改动立刻就反映在了Web浏览器上。除了是在应用程序的用户界面层面,在数据库以上的每一个层面上都是这么。
酷炫的玩具。
假如你通过wildfly-jar-maven-plugin试用wildfly-preview和wildfly-datasources-preview-galleon-pack,这么这儿有几个小提示:
export POSTGRESQL_HOST=server.withyourdatabase.com
export POSTGRESQL_PORT=5432
export POSTGRESQL_DATABASE=quickDb
export POSTGRESQL_USER=yourUsername
export POSTGRESQL_PASSWORD=yourSecretPassword
复制代码
另外,在IDE中配置数据库环境变量的事例:
在碰到这个插件,并在WildFly社区的帮助下使用预览版联接到数据库后,我很快就离不开这个工具组合了。我取笑自己:“我如何会错过这个?”而且,这种Galleon“功能包”和wildfly-jar-maven-plugin为开发者提供了十分好的体验,让人乐在其中。这一点在mvnwildfly-jar:dev-watch上表现得尤为显著!
据悉,在处于活跃开发状态时,“mvnwildfly-jar:dev-watch”还是很有用的,它让开发者可以获得一个可感知数据库的JAR,具有WildFly固有的所有功能,可以随时布署。有了这个插件,这个过程就很简单了linux系统环境变量设置,只要发出命令:
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环境,这么你可能会使用像BitnamiSealedSecrets或HashiCorpVault这样的东西来应对这个挑战。在你的工作站上,或则是在你能控制操作环境的服务器上,应用程序可以引用这个环境。
然而,假若最适宜应用程序的做法是在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”命令是完成任务所必需的,在工作站或服务器上都不是问题。通过“mvnwildfly-jar:watch-dev”和“mvncleanpackagewildfly-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中,这么你可以依照自己的布署需求想像出其他配置任务。
需求永无止境
这真是太酷了。你还想要哪些呢?我很高兴你如此问,由于假如我不想要更多,那我还算哪些终端用户?
我想使用EclipseVert.x驱动联接数据库,并希望这种驱动才能步入wildfly-datasources-preview-galleon-pack中。这个心愿得以实现的前提是,新版本的Hibernate(WildFly的JPA和ORM实现)以及HibernateReactive发布。Hibernate网站显示,那将是5.6版本。Hibernate5.3打包了wildfly-preview。假如HibernateORM6在JakartaEE10之前达到稳定状态,这似乎就不是问题了。从Quarkus这样的项目中可以见到HibernateReactive带来的益处,我很想见到WildFly中也提供这种功能,只要这种新增功能不违背JakartaEE标准。这应当不是问题,由于该标准一般不抵触应用服务器和/或工具供应商提供“更多”的特点。
还有一个WildFlyMicroProfileReactiveFeaturePack,但不像Panache,我在哪个项目库中没有见到任何对HibernateReactive的具体引用。
结语
这种不仅仅是新玩具,但是是有用的工具。假如你正在为开发数据库驱动的应用程序了解wildfly-preview,这么不妨试一试wildfly-jar-maven-plugin和wildfly-datasources-preview-galleon-pack。
我在GitHub上发布了一个小的示例项目linux系统环境变量设置,假如你想快速试用一下这个新工具组合,这么可以从这儿入手。其中包括上面提及的那种简单的Docker文件,还有一个KubernetesYAML文件示例。该示例代码中有一个参考SQL文件,可以配置JPA持久化单元和JPA对象。假如你向表中填充了数据,还有一个JSF页面可以把它们显示下来。wildfly-datasources-preview-galleon-pack使可启动JAR包才能感知数据库,你只需付出极少的努力(只需设置环境变量以指向你的数据库),就可以让示例应用程序获取并显示数据。
相关资源
JakartaEE确实是Java生态系统的重心。假如你没有通过一个或多个实现整个标准的应用服务器(如WildFly)直接使用它,这么你也很可能在间接地使用它的一个库,由生态系统中其他Java项目提供的实现。本文讨论的工具将使使用JakartaEE和WildFly成为一种非常愉快的经历。在Java和JakartaEE领域有许多了不起的事情发生,这个领域的活动虽然只会加速。要想不错过一些能真正提升生产力,改善这一基本标准的使用体验的东西,可能是一个不小的挑战。不仅Eclipse基金会(JakartaEE的管理机构)之外,JakartaEEAmbassadors也是一个很棒的社区和开发者资源。这是一个挺好的方法,让你可以了解JakartaEE本身及周边的情况。假如你还不是社区成员,这么还请考虑加入JakartaEEAmbassadors,借此为途径参与到这一部份Java生态系统。
再度谢谢wildfly-extras团队。WildFly项目提供了许多好工具,可不止这儿讨论的这两个。这种工具中的每一个都降低了使用JakartaEE和WildFly开发应用程序的乐趣!
作者简介:
DennisGesker是一位经验丰富的Java开发人员,也是JakartaEEAmbassadors的成员。他目前正旨在于CandelaGlobal项目。这是一个社交媒体金融科技项目,将于明年晚些时侯推出。
了解更多软件开发与相关领域知识,点击访问InfoQ官网:,获取更多精彩内容!