譯者 | 布加迪
JAVA生態(tài)系統(tǒng)里面有形形色色、五花八門的開源項(xiàng)目,這些項(xiàng)目是為了滿足各種可以想象到的需求而開發(fā)的。我們很容易錯(cuò)過(guò)其中一些出色的項(xiàng)目。下面介紹七個(gè)開源Java項(xiàng)目,從全棧應(yīng)用程序開發(fā)、微服務(wù)、Wasm到JVM替代方案,各種需求都能滿足。
1.Vaadin的Hilla
Hilla是一個(gè)全棧框架,擁有基于Java的后端和JavaScript前端。它支持響應(yīng)式前端框架React和Lit。
Hilla讓您可以用一個(gè)簡(jiǎn)單的命令:npx @vaadin/cli init --hilla foundry-hilla搭建一個(gè)新的全棧項(xiàng)目。這是一個(gè)NPM命令,但它將部署帶有Vite構(gòu)建的前端目錄的標(biāo)準(zhǔn)Maven布局,并且一切都準(zhǔn)備就緒,使用./mvnw腳本即可協(xié)同運(yùn)行。
Hilla在兩個(gè)應(yīng)用程序之間強(qiáng)制執(zhí)行類型,這意味著您的IDE可以在Java API和使用它的TypeScript前端當(dāng)中檢測(cè)和傳遞更改。在這個(gè)框架中,自動(dòng)完成和重構(gòu)完全可以正常使用。這項(xiàng)功能在感覺上類似全TypeScript環(huán)境中的tRPC。
Hilla還通過(guò)JPA(在Hibernate上)與MySQL和PostgreSQL等許多SQL數(shù)據(jù)庫(kù)集成持久性。
它有點(diǎn)像jHipster,但更自成一體。這意味著Hilla在它所能結(jié)合的技術(shù)方面不是很靈活,但它為您提供了一條更平坦的跨界之路。Hilla得到了精心的維護(hù)和記錄。如果您需要用Java構(gòu)建一個(gè)全棧應(yīng)用程序,并且喜歡React或Lit作為前端,Hilla是一種值得考慮的出色框架。
相關(guān)鏈接:https://www.infoworld.com/article/3655139/intro-to-hilla-the-full-stack-java-framework.html
2.jHipster
繼續(xù)圍繞全棧框架這個(gè)主題,我們接下來(lái)介紹jHipster。jHipster采用了一種非常靈活的方法,可以使用Java作為API中間件,將多種不同的技術(shù)整合到一個(gè)連貫的堆棧中。您可以從幾個(gè)響應(yīng)式前端以及眾多SQL和NoSQL數(shù)據(jù)庫(kù)系統(tǒng)中進(jìn)行選擇。
與Hilla一樣,jHipster首先使用NPM軟件包(jHipster -generator工具)生成應(yīng)用程序。該工具將逐步引導(dǎo)您填完一份問(wèn)卷,讓您對(duì)其功能有一番清楚的了解。如果您碰巧遇到ERR_PACKAGE_PATH_NOT_EXPORTED錯(cuò)誤,請(qǐng)參閱這里的解決方案:https://Github.com/jhipster/generator-jhipster/issues/19627。
jHipster首先讓您在單體式應(yīng)用程序、微服務(wù)架構(gòu)或網(wǎng)關(guān)之間進(jìn)行選擇,讓您對(duì)該框架的范圍有一些了解。如果您選擇單體式應(yīng)用程序,隨后就可以使用Spring WebFlux把它變成一個(gè)類似響應(yīng)式的應(yīng)用程序。接下來(lái),您可以選擇不同類型的身份驗(yàn)證,比如JWT或Oauth 2。然后,您得從幾個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中進(jìn)行選擇,比如SQL、MongoDB和Cassandra,隨后從二級(jí)應(yīng)用程序緩存中進(jìn)行選擇,比如Ehcache、Memcached或redis。
接下來(lái),jHipster生成器工具允許添加另外幾項(xiàng)技術(shù):用于搜索引擎的Elasticsearch、使用Spring WebSocket的WebSockets、作為異步消息代理的Apache Kafka,以及使用OpenAPI-generator的API優(yōu)先開發(fā)技術(shù)。接下來(lái),您可以從幾個(gè)前端框架中選擇一個(gè),并生成Admin UI(如果您這么選擇的話)以及幾個(gè)主題。
jHipster還擁有國(guó)際化和測(cè)試功能,它既支持Maven又支持Gradle。
這是相當(dāng)強(qiáng)大的功能。它還能夠生成域模型、數(shù)據(jù)結(jié)構(gòu)以及與之配套的UI。jHipster是構(gòu)建多種類型的Java應(yīng)用程序的出色選擇。
相關(guān)鏈接:https://www.infoworld.com/article/3661308/intro-to-jhipster-a-full-stack-framework-for-java-and-javascript.html
3.GraalVM
GraalVM項(xiàng)目于2018年3月問(wèn)世,旨在提供更廣泛的虛擬機(jī)實(shí)現(xiàn)。GraalVM可以做JVM能做的所有事情,還不止于此:它允許用戶使用眾多語(yǔ)言,并輸出到眾多目標(biāo)執(zhí)行環(huán)境。它還集成幾種類型的編譯器,包括可以增強(qiáng)性能的JIT(及時(shí))編譯器。
GraalVM可以運(yùn)行任何編譯成LLVM的語(yǔ)言,包括C、C++、Rust和Swift等。它還可以處理字節(jié)碼語(yǔ)言,比如Java、Scala、Kotlin和Groovy。它還支持JavaScript、Python/ target=_blank class=infotextkey>Python、Ruby和R語(yǔ)言。在未來(lái),我們有望看到GraalVM支持Zig。
這意味著我們獲得了JVM面向所有類型語(yǔ)言的一次寫入、隨處運(yùn)行的優(yōu)點(diǎn)。比如說(shuō),GraalVM可以拿來(lái)編譯成LLVM字節(jié)碼的C程序,使用lli命令運(yùn)行它。或者,GraalVM可以使用clang直接將C代碼編譯成可執(zhí)行文件。GraalVM輸出許多(但不是所有)語(yǔ)言和平臺(tái)的獨(dú)立執(zhí)行版本。
它還包括對(duì)許多目標(biāo)二進(jìn)制文件的支持,比如Wasm、linux變體、macOS、windows、IOS和Android/ target=_blank class=infotextkey>安卓。針對(duì)許多目標(biāo),GraalVM支持無(wú)需安裝GraalVM即可運(yùn)行的原生映像。它還允許開發(fā)人員選擇執(zhí)行模式(比如JIT編譯、AOT編譯和解釋),從而微調(diào)性能配置文件。
GraalVM得到了精心的維護(hù)和記錄,擁有一個(gè)活躍的社區(qū)。整體上看,它是一個(gè)引人注目的項(xiàng)目,正漸漸成為一種通用語(yǔ)言工具。請(qǐng)參閱GraalVM項(xiàng)目主頁(yè):https://www.graalvm.org/22.0/docs/introduction/,以了解更多信息。
4.Micronaut
Micronaut是Java開發(fā)方面的一個(gè)新思路,面向現(xiàn)代云和無(wú)服務(wù)器環(huán)境。它擁有眾多功能,比如用于搭建、構(gòu)建、執(zhí)行和測(cè)試項(xiàng)目的命令行工具,支持眾多技術(shù)。最重要的是,Micronaut是圍繞支持AOT的控制反轉(zhuǎn)(IOC)框架設(shè)計(jì)的,這種框架在面對(duì)大型代碼庫(kù)時(shí)保持啟動(dòng)時(shí)間。
再加上面向微服務(wù)的支持,比如服務(wù)發(fā)現(xiàn)、跟蹤和容器化部署,對(duì)于現(xiàn)代Java開發(fā)來(lái)說(shuō),Micronaut是一種經(jīng)過(guò)深思熟慮的、引人注目的選擇。
Micronaut提供了基于Web的項(xiàng)目設(shè)計(jì)器,您可以使用它來(lái)了解可以接入到Micronaut核心的工具的種類。這個(gè)工具實(shí)質(zhì)上類似Spring Initializr或jHipster的在線生成器,但它有自己的特點(diǎn)。Micronaut的核心是響應(yīng)式,支持像RxJava和Reactor這樣的響應(yīng)式實(shí)現(xiàn),而其他一切都建立在這個(gè)核心概念上。Micronaut包含自己的響應(yīng)式HTTP客戶軟件。
Micronaut中的每個(gè)節(jié)點(diǎn)都是一個(gè)響應(yīng)式組件,可以使用ZooKeeper或Eureka等集中式服務(wù)代理組合到更龐大的微服務(wù)架構(gòu)中。
Micronaut使用戶很容易通過(guò)一站式框架來(lái)采用最佳實(shí)踐,這種框架在廣度上類似Spring,但更注重具體的實(shí)現(xiàn)細(xì)節(jié)。對(duì)于面對(duì)基于Java的云和無(wú)服務(wù)器環(huán)境的開發(fā)人員來(lái)說(shuō),這是一個(gè)誘人的選擇。
相關(guān)鏈接:https://www.infoworld.com/article/3658968/intro-to-micronaut-a-cloud-native-java-framework.html
5.MicroStream
在基于Java的面向?qū)ο蟪志眯缘陌l(fā)展過(guò)程中,MicroStream可能代表了最終的概念完善。它獲取運(yùn)行時(shí)對(duì)象圖的原樣,允許使用面向?qū)ο缶幊陶Z(yǔ)義將其持久化到任意數(shù)量的底層數(shù)據(jù)庫(kù)系統(tǒng)。
MicroStream允許您遵循對(duì)象和屬性這一概念,同時(shí)該框架完成保存和恢復(fù)它們的大部分工作。作為一名開發(fā)人員,您仍然需要考慮抓取策略和持久化邊界等元關(guān)注點(diǎn)(meta concerns),但是這些元關(guān)注點(diǎn)的定義非常簡(jiǎn)單,基本上不會(huì)干擾應(yīng)用程序代碼,運(yùn)行起來(lái)就像不用考慮持久化一樣。
MicroStream包含根(root)的概念,它定義了持久化樹的根。一個(gè)應(yīng)用程序可以有多個(gè)根,如代碼片段1所示。
代碼片段1. 用MicroStream保存和恢復(fù)
復(fù)制
// Saving
EmbeddedStorageManager manager = EmbeddedStorage.start();
manager.setRoot(myObject);
manager.storeRoot();
//Restoring
EmbeddedStorageManager storageEngine = EmbeddedStorage.start();
myObject = (MyClass) storageEngine.root();
MicroStream為Java中的對(duì)象持久化提供了一條新的思路,絕對(duì)值得開展任何新項(xiàng)目的開發(fā)人員關(guān)注。
6.TeaVM
將Java編譯成Wasm(WebAssembly)仍然是一個(gè)前沿領(lǐng)域,但TeaVM使用戶在今天就能這么做。TeaVM支持將Java字節(jié)碼轉(zhuǎn)換成JavaScript(類似google Web Toolkit)和Wasm。這些可用于創(chuàng)建在瀏覽器內(nèi)部使用Java代碼和庫(kù)的Web應(yīng)用程序。
TeaVM的工作機(jī)理是,先將代碼編譯為低級(jí)的中間表示,然后進(jìn)一步優(yōu)化,并轉(zhuǎn)譯成WebAssembly指令。由此生成的代碼非常高效,可以在任何支持WebAssembly的現(xiàn)代瀏覽器中運(yùn)行。
TeaVM的主要優(yōu)點(diǎn)之一是它支持流行的Java框架,比如Spring和Hibernate。開發(fā)人員可以使用這些框架來(lái)構(gòu)建復(fù)雜的全棧Web應(yīng)用程序,然后將代碼編譯成Wasm,用于基于Web的部署。
雖然TeaVM仍然是處于萌芽階段的項(xiàng)目——創(chuàng)建者將其用于其日常工作,然后將修正版和改進(jìn)添加到開源代碼庫(kù)中,但它似乎提供了目前從Java到Wasm的最佳途徑。
總的來(lái)說(shuō),TeaVM是一個(gè)強(qiáng)大而靈活的工具,用于使用Java開發(fā)Web應(yīng)用程序,它提供了在瀏覽器和其他Wasm環(huán)境中處理Java的一條有趣途徑。
7.Apache Flink
Flink啟動(dòng)于2011年,現(xiàn)已發(fā)展成為一個(gè)領(lǐng)先的事件處理框架。愛彼迎?.NETflix等許多家喻戶曉的公司都將它用于實(shí)時(shí)處理,一個(gè)相對(duì)容易管理的軟件包卻為用戶提供了強(qiáng)大的功能。
Apache Flink將容錯(cuò)和狀態(tài)管理整合到分布式、對(duì)容器友好的系統(tǒng)中。它可以自動(dòng)擴(kuò)展或縮小規(guī)模,以處理動(dòng)態(tài)負(fù)載。
雖然在Docker中與Kubernetes一起運(yùn)行Flink很典型,但Flink也可以使用Apache Beam等框架在無(wú)服務(wù)器基礎(chǔ)設(shè)施上運(yùn)行,比如AWS Lambda、Azure Functions和Google Cloud Functions。這提供了僅需為處理過(guò)程中使用的計(jì)算資源付費(fèi)的好處,便于更輕松更高效地?cái)U(kuò)展。
Flink在底層有很多功能,但簡(jiǎn)單的特性很容易掌握。比如在代碼片段2中,F(xiàn)link通過(guò)端口9999監(jiān)視套接字,并計(jì)算在那里接收到的文本中的單詞數(shù),然后將數(shù)據(jù)輸出到控制臺(tái)。
代碼片段2. 使用Flink處理簡(jiǎn)單文本
復(fù)制
DataStream<String> text = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String,Integer>> wordCounts = text
.flatMap(new FlatMapFunction<String, Tuple2<String,Integer>>() {
public void flatMap(String value, Collector<Tuple2<String,Integer>> out) {
for (String word : value.split(" ")) {
out.collect(new Tuple2<String,Integer>(word, 1));
}
}
})
.keyBy(0)
.sum(1);
wordCounts.print();
您可以看到Flink與功能樣式兼容,平臺(tái)本身以一種可擴(kuò)展、容錯(cuò)的方式將功能擴(kuò)展到云基礎(chǔ)設(shè)施。總之,它是一個(gè)給人留下深刻印象的項(xiàng)目,適用于實(shí)時(shí)事件處理。
相關(guān)鏈接:https://nightlies.apache.org/flink/flink-docs-master/docs/try-flink/flink-operations-playground/#starting-the-playground
原文標(biāo)題:7 awesome Java projects you should know about,作者:Matthew Tyson