java_manager/lib.rs
1//! A library for locating Java installations on the local system and executing Java programs.
2//!
3//! This crate provides functionality to:
4//! - Discover Java runtimes via `PATH`, `JAVA_HOME`, or deep system scans.
5//! - Extract detailed metadata (version, vendor, architecture) from each installation.
6//! - Execute Java applications with configurable arguments, memory settings, and I/O redirection.
7//!
8//! # Examples
9//!
10//! ```no_run
11//! use java_manager::{java_home, JavaRunner};
12//!
13//! // Find all Java installations in PATH
14//! let java = java_home().unwrap();
15//! // Run a JAR file
16//! JavaRunner::new()
17//! .java(java)
18//! .arg("--version")
19//! .execute()?;
20//! # Ok::<_, java_manager::JavaError>(())
21//! ```
22
23/// TTL-based cache that avoids redundant full-disk scans of Java installations.
24pub mod cache;
25
26/// Error types returned by every fallible operation in this crate.
27pub mod error;
28
29/// Execute Java programs with configurable arguments, memory, and I/O.
30pub mod execute;
31
32/// [`JavaInfo`] and [`JavaVersion`] — structured metadata from a Java installation.
33pub mod info;
34
35/// Read the `JAVA_HOME` environment variable.
36pub mod local;
37
38/// Discover Java installations via `PATH`, Everything SDK, registry, BFS, and more.
39pub mod search;
40
41/// Async JDK download with resume support, parallel chunks, and archive extraction.
42#[cfg(feature = "download")]
43pub mod download;
44
45pub use cache::JavaCache;
46pub use error::JavaError;
47pub use execute::JavaRedirect;
48pub use execute::JavaRunner;
49pub use info::JavaInfo;
50pub use info::JavaVersion;
51pub use local::java_home;
52pub use search::deep_search;
53pub use search::full_search;
54pub use search::quick_search;
55
56#[cfg(feature = "parallel")]
57pub use search::parallel_full_search;
58
59/// Filter a list of `JavaInfo` by a version requirement.
60///
61/// See [`JavaInfo::matches_version`] for the supported requirement formats.
62pub fn filter_by_version(javas: Vec<JavaInfo>, req: &str) -> Vec<JavaInfo> {
63 javas
64 .into_iter()
65 .filter(|j| j.matches_version(req))
66 .collect()
67}
68
69/// Pick the best (highest version) match from a list of `JavaInfo`.
70///
71/// Returns `None` if no installation matches the requirement.
72///
73/// # Examples
74///
75/// ```
76/// use java_manager::{JavaInfo, best_match};
77///
78/// let javas = vec![
79/// JavaInfo { version: "11.0.2".into(), parsed_version: java_manager::JavaVersion::parse("11.0.2"), ..Default::default() },
80/// JavaInfo { version: "17.0.1".into(), parsed_version: java_manager::JavaVersion::parse("17.0.1"), ..Default::default() },
81/// ];
82///
83/// let best = best_match(javas, "11").unwrap();
84/// assert_eq!(best.version, "11.0.2");
85/// ```
86pub fn best_match(javas: Vec<JavaInfo>, req: &str) -> Option<JavaInfo> {
87 javas
88 .into_iter()
89 .filter(|j| j.matches_version(req))
90 .max_by(|a, b| a.parsed_version.cmp(&b.parsed_version))
91}