1.Java 新闻综述:Spring Boot 更新、标源Kotlin、源码Scala、分析OpenJDK、标源Liberica JDK
2.hanlpå¯ä»¥ä½¿ç¨pythonè°ç¨å
Java 新闻综述:Spring Boot 更新、源码Kotlin、分析web认证系统源码Scala、标源OpenJDK、源码Liberica JDK
本周的分析Java新闻综述,聚焦于JDK、标源OpenJDK、源码Liberica JDK、分析GraalVM、标源MicroProfile、源码Quarkus、分析Hibernate、Spring Framework、spring应用源码分析JobRunr、RefactorFirst、Apache Tika和Kotlin、Scala等领域的最新动态。
JDK 与JDK 发布了早期访问版本,建基于Build 与Build 7,分别包含了Build 与Build 6的更新,重点在于修复了各种问题。原生源码uniAPP开发人员被鼓励利用Java错误数据库报告任何发现的错误。
Red Hat的高级免费Java软件工程师Andrew Hughes宣布了OpenJDK .0.与OpenJDK 8u的发布,这两个版本包含了年7月的安全修复与诸多其他改动。BellSoft也随后发布了针对上述版本的Liberica JDK,确保了与OpenJDK的同步。
Oracle实验室发布了GraalVM .2,其改进包括原生映像实用程序、编译器更新以及对其他受支持语言的脚本如何变成源码优化。MicroProfile工作组发布了4.1版本,引入了包括集成MicroProfile父POM、支持新的Startup Kubernetes探针以及澄清属性、默认值等新功能。预计MicroProfile 5.0将在年第四季度推出。
Quarkus 2.0.3作为Quarkus 2.0的第三个维护版本,带来了错误修复、文档改进、提供源码的系统依赖升级等更新。Hibernate ORM 5.5.4.Final引入了CamelCaseToUnderscoresNamingStrategy类,以响应SpringPhysicalNamingStrategy类的流行趋势。同时,Hibernate Search 6.0.6.Final修复了AWS请求签名在特定情况下产生错误签名的问题。
Spring Security 5.6.0-M1的发布提供了一系列改进,包括AuthorizationManager方法安全接口、支持类中的任何数据类型OAuth2AccessTokenResponse、以及Spring Security示例的单独存储库。Spring Boot 2.5.3与2.4.9版本分别提供了与个错误修复,包括依赖项升级与文档改进。即将推出的Spring Boot 2.6.0包含新功能,如Spring Data Envers的自动配置、改进的指标支持、自动配置的Spring Web服务服务器测试以及Maven插件的Start Goal配置改进。
JobRunr的最新版本成功编译了JDK 的早期访问版本,支持在JVM上执行后台处理。RefactorFirst插件的Maven版本0.1.0由吉姆Bethancourt发布,为开发者提供了一个工具,以确定应首先重构应用程序中的哪些类。Apache Tika发布了其元数据提取工具包的2.0.0版本,这一版本包括了对Apache Tika 1.x分支的重大重构、模块的模块化、Parser模块中的新Pipes模块、错误修复以及依赖项升级。
JetBrains推出了Kotlin 1.5.-M1的预览版本,其中包括原生Apple Silicon支持、Gradle插件中的新DSL格式改进CocoaPods配置、以及使用新的IR后端改进了Kotlin/JS应用程序的调试。Scala在GA版本之后,分别提供了维护版本3.0.1与3.0.2-RC1,其中包含了新的@experimental注释、改进的兼容性、更好的错误信息以及一些bug修复。计划于9月初发布Scala 3.0.2的稳定版本。
hanlpå¯ä»¥ä½¿ç¨pythonè°ç¨å
å®è£ JDK
JPype并没æåIKVMé£æ ·å®ç°èªå·±çJVMï¼èæ¯ä»¥pipeæ¹å¼è°ç¨åçJVMãæ以æ们éè¦ä¸ä¸ªJVMï¼æ¯å¦ï¼
Oracle JDK
OpenJDK
å®è£ JDKé常ç®åï¼åæ¸ æ¥ä½åä½å³å¯ï¼å¿ é¡»ä¸OSåPythonçä½æ°ä¸è´ï¼å ·ä½å®è£ è¿ç¨ä¸åèµè¿°ã
å¯ä¸éè¦æ³¨æçæ¯ï¼å¿ 须设置ç¯å¢åéJAVA_HOMEå°JDKçæ ¹ç®å½ï¼JDKçå®è£ ç¨åºä¸ä¸å®ä¼å¸®ä½ åè¿ä¸æ¥ã
å®è£ ç¼è¯å·¥å ·é¾
Pythonçpackageä¸è¬æ¯ä»¥æºç å½¢å¼åå¸çï¼å ¶ä¸ä¸äºC代ç å¿ é¡»å¨ç¨æ·æºå¨ä¸ç¼è¯ï¼æ以éè¦å®è£ ç¼è¯å·¥å ·é¾ãå½ç¶ä½ ä¹å¯ä»¥è·³è¿è¿æ¥ï¼ç´æ¥ä¸è½½binaryã
Windows
å®è£ å è´¹çVisual C++ Express ã
Debian/Ubuntu
sudo apt-get install g++
Red Hat/Fedora
su -c 'yum install gcc-c++'
å®è£ JPype
æ¬æ读è åºè¯¥é½æ¯Pythonç¨åºåï¼æ以ç¥è¿äºå®è£ Pythonè¿ä¸æ¥ãä¸è¿å¿ 须注æçæ¯ï¼JPypeçæ¬ä¸Pythonç对åºå ¼å®¹å ³ç³»ï¼
Python2.xï¼JPype
Python3.x:JPype1-py3
使ç¨setup.pyå®è£
ä¸è½½æºç å解åï¼å¨ç®å½ä¸è¿è¡ï¼
*nix
sudo python3 setup.py install
Windows
python setup.py install
ç´æ¥ä¸è½½binary
å½ç¶ä½ ä¹å¯ä»¥éæ©ä¸è½½binaryï¼æ¯å¦JPype1-py3主页ä¸çbinaryå表ã
å¨Pycharmä¸å®è£
å¦æä½ æ£å¨ä½¿ç¨Pycharmè¿æ¬¾IDEçè¯ï¼é£ä¹äºæ å°±ç®åå¤äºã
é¦å å¨Project Interpreteréé¢ç¹å»å å·ï¼
æç´¢JPypeï¼éæ©ä½ éè¦ççæ¬å®è£ :
ç¨ççå»å°±å®è£ æåäºï¼
æµè¯å®è£ ç»æ
ç»äºåå°äºå代ç çå¼å¿æ¶é´äºï¼å¯ä»¥éè¿å¦ä¸ä»£ç æµè¯æ¯å¦å®è£ æåï¼
from jpype import *startJVM(getDefaultJVMPath())java.lang.System.out.println("hello world")shutdownJVM()
è¾åºå¦ä¸ç»æ表示å®è£ æåï¼
hello worldJVM activity report : classes loaded : JVM has been shutdown
è°ç¨HanLP
å ³äºHanLP
HanLPæ¯
ä¸ä¸ªè´åäºåç产ç¯å¢æ®åNLPææ¯çå¼æºJavaå·¥å ·å ï¼æ¯æä¸æåè¯ï¼N-æçè·¯åè¯ãCRFåè¯ãç´¢å¼åè¯ãç¨æ·èªå®ä¹è¯å ¸ãè¯æ§æ 注ï¼ï¼å½åå®ä½
è¯å«ï¼ä¸å½äººåãé³è¯äººåãæ¥æ¬äººåãå°åãå®ä½æºæåè¯å«ï¼ï¼å ³é®è¯æåï¼èªå¨æè¦ï¼çè¯æåï¼æ¼é³è½¬æ¢ï¼ç®ç¹è½¬æ¢ï¼ææ¬æ¨èï¼ä¾åå¥æ³åæ
ï¼MaxEntä¾åå¥æ³åæãç¥ç»ç½ç»ä¾åå¥æ³åæï¼ã
ä¸è½½HanLP
ä½ å¯ä»¥ç´æ¥ä¸è½½Portableççjarï¼é¶é ç½®ã
ä¹å¯ä»¥ä½¿ç¨èªå®ä¹çHanLPââHanLPç±3é¨åç»æï¼ç±»åºhanlp.jarå ã模ådataå ãé ç½®æ件hanlp.propertiesï¼è¯·åå¾é¡¹ç®ä¸»é¡µä¸è½½ææ°çï¼/hankcs/HanLP/releasesã对äºéportableçï¼ä¸è½½åï¼ä½ éè¦ç¼è¾é ç½®æ件第ä¸è¡çrootæådataçç¶ç®å½ï¼è¯¦è§ææ¡£ã
è¿éï¼å设æ°å»ºäºä¸ä¸ªç®å½ï¼åå®ä¸ºC:\hanlpï¼ï¼æhanlp.jaråhanlp.propertiesï¼portableççè¯ï¼ä» éä¸ä¸ªhanlp-portable.jarï¼æ¾è¿å»ï¼
Pythonè°ç¨
ä¸é¢æ¯ä¸ä»½Python3çè°ç¨ç¤ºä¾ï¼
# -*- coding:utf-8 -*-
# Filename: main.py
# Authorï¼hankcs
# Date: // :
from jpype import
*startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\hanlp\hanlp-1.2.8.jar;C:\hanlp", "-Xms1g", "-Xmx1g")
HanLP = JClass('com.hankcs.hanlp.HanLP')
# ä¸æåè¯
print(HanLP.segment('ä½ å¥½ï¼æ¬¢è¿å¨Pythonä¸è°ç¨HanLPçAPI'))
testCases = [
"åååæå¡",
"ç»å©çåå°æªç»å©çç¡®å®å¨å¹²æ°åè¯å",
"ä¹°æ°´æç¶åæ¥ä¸ååæåå»ä¸åä¼",
"ä¸å½çé¦é½æ¯å京",
"欢è¿æ°èå¸çåæ¥å°±é¤",
"工信å¤å¥³å¹²äºæ¯æç»è¿ä¸å±ç§å®¤é½è¦äº²å£äº¤ä»£å£äº¤æ¢æºçææ¯æ§å¨ä»¶çå®è£ å·¥ä½",
"éçé¡µæ¸¸å ´èµ·å°ç°å¨ç页游ç¹çï¼ä¾èµäºåæ¡£è¿è¡é»è¾å¤æç设计åå°äºï¼ä½è¿åä¹ä¸è½å®å ¨å¿½ç¥æã"]
for sentence in testCases: print(HanLP.segment(sentence))
# å½åå®ä½è¯å«ä¸è¯æ§æ 注
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('ä¸å½ç§å¦é¢è®¡ç®ææ¯ç 究æçå®æåºæææ£å¨ææèªç¶è¯è¨å¤ç课ç¨'))
# å ³é®è¯æå
document = "æ°´å©é¨æ°´èµæºå¸å¸é¿éæå¿ 9ææ¥å¨å½å¡é¢æ°é»å举è¡çæ°é»åå¸ä¼ä¸éé²ï¼" \
"æ ¹æ®ååå®æäºæ°´èµæºç®¡çå¶åº¦çèæ ¸ï¼æé¨åçæ¥è¿äºçº¢çº¿çææ ï¼" \
"æé¨åçè¶ è¿çº¢çº¿çææ ã对ä¸äºè¶ è¿çº¢çº¿çå°æ¹ï¼éæå¿ è¡¨ç¤ºï¼å¯¹ä¸äºåç¨æ°´é¡¹ç®è¿è¡åºåçéæ¹ï¼" \
"ä¸¥æ ¼å°è¿è¡æ°´èµæºè®ºè¯åå水许å¯çæ¹åã"
print(HanLP.extractKeyword(document, 2))
# èªå¨æè¦
print(HanLP.extractSummary(document, 3))
# ä¾åå¥æ³åæ
print(HanLP.parseDependency("å¾å çè¿å ·ä½å¸®å©ä»ç¡®å®äºæç»éé¹°ãæ¾é¼ å麻éä½ä¸ºä¸»æ»ç®æ ã"))
shutdownJVM()