Version comparator in ToolchainDiscoverer uses lexicographic String.compareTo instead of numeric version comparison
Maintainer thường phản hồi trong vòng 2 ngày
@elharo đang làm issue này rồi.
Từ ngày 22/7/2026.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 78/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- java
- Lĩnh vực
- build-system
Hướng nghiên cứu
Bắt đầu tại ToolchainDiscoverer.java:290-306 và kiểm tra bộ so sánh version() cùng thứ tự đảo ngược của nó. Thay thế phép so sánh các phân đoạn theo thứ tự từ điển bằng thứ tự phiên bản dạng số, sau đó xác minh rằng các phiên bản JDK như 8, 10, 11 và 17 được sắp xếp với phiên bản cao nhất trước tiên.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
The version() comparator in ToolchainDiscoverer.java uses String.compareTo() for version comparison, which is lexicographic rather than numeric. This produces incorrect sort orders for JDK versions with different digit counts.
Location
ToolchainDiscoverer.java:290-306
Code
Comparator<ToolchainModel> version() {
return comparing((ToolchainModel tc) -> tc.getProvides().getProperty(VERSION), (v1, v2) -> {
String[] a = v1.split("\\.");
String[] b = v2.split("\\.");
int length = Math.min(a.length, b.length);
for (int i = 0; i < length; i++) {
String oa = a[i];
String ob = b[i];
if (!Objects.equals(oa, ob)) {
if (oa == null || ob == null) {
return oa == null ? -1 : 1;
}
int v = oa.compareTo(ob);
if (v != 0) {
return v;
}
}
}
return a.length - b.length;
})
.reversed();
}
Problem
String.compareTo() compares strings lexicographically, not numerically. This causes incorrect ordering:
"8" > "11"(because '8' > '1' in ASCII) -- WRONG, 8 < 11"8" > "17"-- WRONG"9" > "10"-- WRONG"10" > "8"-- WRONG
The .reversed() at the end means higher versions should sort first, but this bug corrupts the ordering for any comparison between single-digit and multi-digit major versions.
Impact
JDK toolchain discovery and selection produces wrong sort order, which means select-jdk-toolchain may choose a suboptimal JDK. For example, if JDK 8 and JDK 11 are both available and match requirements, JDK 8 could be incorrectly preferred over JDK 11.
Suggested Fix
Use proper numeric version comparison (e.g., split segments and compare each segment as integers, or use a dedicated version comparator like ComparableVersion from Maven artifact API).
- Ngôn ngữ chính
- Java
- Star
- 27
- Fork
- 32
- Merge trung bình
- 1 ngày 15 giờ
- Pull request đã merge (30 ngày)
- 3
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của apache/maven-toolchains-plugin
-
NPE during display-discovered-jdk-toolchains goal in ToolchainDiscoverer.discoverToolchains()Có thể đã có người làm @efegokdemir đã nhận 12 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
apache/maven-toolchains-plugin#191 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
New select-jdk-toolchain goal should warn about empty configCó thể đã có người làm @efegokdemir đã nhận 11 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
apache/maven-toolchains-plugin#183 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Unnecessary static synchronization in ToolchainMojo causes contention in multi-module buildsCó thể đã có người làm @elharo đã nhận 75 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
apache/maven-toolchains-plugin#174 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Dead code: unreachable null check on @Parameter(required=true) in ToolchainMojoCó thể đã có người làm @efegokdemir đã nhận 11 ngày trước. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
apache/maven-toolchains-plugin#175 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Infinite recursion risk in ToolchainDiscoverer.getCanonicalPath() for root pathsCó thể đã có người làm @efegokdemir đã nhận 11 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
apache/maven-toolchains-plugin#171 ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của apache/maven-toolchains-plugin
Issue tương tự
-
component/operate kind/feature-request
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Forge coverage prompts carry text the agent cannot act onCó thể đã có người làm @graalvmbot đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
oracle/graalvm-reachability-metadata#10572 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[CI] Core CI doesn't run for changes to amoro-format-lance (and amoro-web)Có thể đã có người làm @MarkAlex1234 đã nhận hôm nay. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
area/docs
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
Maintainer thường phản hồi trong vòng 1 ngày