@dimzxzzx07/mc-headless 1.9.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/core/JavaChecker.d.ts +5 -5
- package/dist/core/JavaChecker.d.ts.map +1 -1
- package/dist/core/JavaChecker.js +150 -60
- package/dist/core/JavaChecker.js.map +1 -1
- package/package.json +1 -1
- package/src/core/JavaChecker.ts +171 -70
package/README.md
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
<div align="center">
|
|
8
|
-
<img src="https://img.shields.io/badge/Version-
|
|
8
|
+
<img src="https://img.shields.io/badge/Version-2.0.0-2563eb?style=for-the-badge&logo=typescript" alt="Version">
|
|
9
9
|
<img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge&logo=open-source-initiative" alt="License">
|
|
10
10
|
<img src="https://img.shields.io/badge/Node-18%2B-339933?style=for-the-badge&logo=nodedotjs" alt="Node">
|
|
11
11
|
<img src="https://img.shields.io/badge/Java-Portable-007396?style=for-the-badge&logo=openjdk" alt="Java Portable">
|
|
12
12
|
<img src="https://img.shields.io/badge/Termux-Friendly-00A98F?style=for-the-badge&logo=termux" alt="Termux">
|
|
13
|
-
<img src="https://img.shields.io/badge/Stable-
|
|
13
|
+
<img src="https://img.shields.io/badge/Stable-2.0.0-brightgreen?style=for-the-badge" alt="Stable">
|
|
14
14
|
</div>
|
|
15
15
|
|
|
16
16
|
<div align="center">
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
## Table of Contents
|
|
34
34
|
|
|
35
35
|
- [Overview](#overview)
|
|
36
|
-
- [What's New in
|
|
36
|
+
- [What's New in 2.0.0](#whats-new-in-200)
|
|
37
37
|
- [Features](#features)
|
|
38
38
|
- [Why MC-Headless?](#why-mc-headless)
|
|
39
39
|
- [Installation](#installation)
|
|
@@ -70,9 +70,9 @@ Built specifically for developers, sysadmins, and Minecraft enthusiasts who want
|
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
|
-
## What's New in
|
|
73
|
+
## What's New in 2.0.0
|
|
74
74
|
|
|
75
|
-
### Version
|
|
75
|
+
### Version 2.0.0 - March 2026
|
|
76
76
|
|
|
77
77
|
- **Portable Java** - Auto-download JRE to `/tmp` (no system installation required)
|
|
78
78
|
- **Smart Java Detection** - Uses `which java` to check existing installation
|
|
@@ -140,7 +140,7 @@ wget https://github.com/SkinsRestorer/SkinsRestorerX/releases/latest/download/Sk
|
|
|
140
140
|
tail -f logs/latest.log
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
After (MC-Headless
|
|
143
|
+
After (MC-Headless v2.0.0)
|
|
144
144
|
|
|
145
145
|
```javascript
|
|
146
146
|
const server = new MinecraftServer({
|
|
@@ -298,7 +298,7 @@ async function startServer() {
|
|
|
298
298
|
server.on("ready", (info) => {
|
|
299
299
|
console.clear();
|
|
300
300
|
console.log(`\n==========================================`);
|
|
301
|
-
console.log(`Minecraft Server -
|
|
301
|
+
console.log(`Minecraft Server - v2.0.0`);
|
|
302
302
|
console.log(` IP: ${publicIp}:${info.port}`);
|
|
303
303
|
console.log(` Version: ${info.version}`);
|
|
304
304
|
console.log(` Memory: ${info.memory.used}/${info.memory.max} MB`);
|
|
@@ -6,15 +6,15 @@ export interface JavaInfo {
|
|
|
6
6
|
export declare class JavaChecker {
|
|
7
7
|
private static logger;
|
|
8
8
|
private static readonly JAVA_DIR;
|
|
9
|
-
private static readonly
|
|
10
|
-
private static readonly JAVA_21_URL;
|
|
11
|
-
private static readonly JAVA_11_URL;
|
|
12
|
-
private static readonly JAVA_8_URL;
|
|
9
|
+
private static readonly JAVA_URLS;
|
|
13
10
|
static checkJava(): Promise<boolean>;
|
|
14
11
|
static getSystemJavaPath(): string | null;
|
|
15
12
|
static getSystemJavaVersion(): string | null;
|
|
13
|
+
private static downloadWithCurl;
|
|
14
|
+
private static downloadWithWget;
|
|
15
|
+
private static downloadWithNode;
|
|
16
|
+
private static downloadWithFallback;
|
|
16
17
|
static getOrDownloadPortableJava(version?: '17' | '21' | '11' | '8'): Promise<JavaInfo>;
|
|
17
|
-
private static downloadFile;
|
|
18
18
|
static ensureJava(version?: '17' | '21' | 'auto', usePortable?: boolean): Promise<JavaInfo>;
|
|
19
19
|
static cleanupOldJava(): void;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JavaChecker.d.ts","sourceRoot":"","sources":["../../src/core/JavaChecker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JavaChecker.d.ts","sourceRoot":"","sources":["../../src/core/JavaChecker.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAwB;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IAE1E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAe/B;WAEkB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;WAenC,iBAAiB,IAAI,MAAM,GAAG,IAAI;WASlC,oBAAoB,IAAI,MAAM,GAAG,IAAI;mBAc9B,gBAAgB;mBA0BhB,gBAAgB;mBA0BhB,gBAAgB;mBAsDhB,oBAAoB;WAoBrB,yBAAyB,CAAC,OAAO,GAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;WAqEtF,UAAU,CAAC,OAAO,GAAE,IAAI,GAAG,IAAI,GAAG,MAAe,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;WAqBxG,cAAc,IAAI,IAAI;CAkBvC"}
|
package/dist/core/JavaChecker.js
CHANGED
|
@@ -38,15 +38,28 @@ const child_process_1 = require("child_process");
|
|
|
38
38
|
const fs = __importStar(require("fs-extra"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const https = __importStar(require("https"));
|
|
41
|
+
const http = __importStar(require("http"));
|
|
41
42
|
const tar = __importStar(require("tar"));
|
|
42
43
|
const Logger_1 = require("../utils/Logger");
|
|
43
44
|
class JavaChecker {
|
|
44
45
|
static logger = Logger_1.Logger.getInstance();
|
|
45
46
|
static JAVA_DIR = path.join('/tmp', '.mc-headless-java');
|
|
46
|
-
static
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
static JAVA_URLS = {
|
|
48
|
+
'21': [
|
|
49
|
+
'https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz',
|
|
50
|
+
'https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.2%2B13/OpenJDK21U-jdk_x64_linux_hotspot_21.0.2_13.tar.gz'
|
|
51
|
+
],
|
|
52
|
+
'17': [
|
|
53
|
+
'https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz',
|
|
54
|
+
'https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz'
|
|
55
|
+
],
|
|
56
|
+
'11': [
|
|
57
|
+
'https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz'
|
|
58
|
+
],
|
|
59
|
+
'8': [
|
|
60
|
+
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u402-b06/OpenJDK8U-jdk_x64_linux_hotspot_8u402b06.tar.gz'
|
|
61
|
+
]
|
|
62
|
+
};
|
|
50
63
|
static async checkJava() {
|
|
51
64
|
return new Promise((resolve) => {
|
|
52
65
|
(0, child_process_1.exec)('which java', (error, stdout) => {
|
|
@@ -89,74 +102,76 @@ class JavaChecker {
|
|
|
89
102
|
return null;
|
|
90
103
|
}
|
|
91
104
|
}
|
|
92
|
-
static async
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
downloadUrl = this.JAVA_17_URL;
|
|
114
|
-
break;
|
|
115
|
-
case '11':
|
|
116
|
-
downloadUrl = this.JAVA_11_URL;
|
|
117
|
-
break;
|
|
118
|
-
case '8':
|
|
119
|
-
downloadUrl = this.JAVA_8_URL;
|
|
120
|
-
break;
|
|
121
|
-
default:
|
|
122
|
-
downloadUrl = this.JAVA_17_URL;
|
|
123
|
-
}
|
|
124
|
-
const tarPath = path.join(this.JAVA_DIR, `jre-${version}.tar.gz`);
|
|
125
|
-
await this.downloadFile(downloadUrl, tarPath);
|
|
126
|
-
this.logger.info(`Extracting Java ${version}...`);
|
|
127
|
-
await fs.ensureDir(javaHome);
|
|
128
|
-
await tar.extract({
|
|
129
|
-
file: tarPath,
|
|
130
|
-
cwd: javaHome,
|
|
131
|
-
strip: 1
|
|
105
|
+
static async downloadWithCurl(url, destPath) {
|
|
106
|
+
return new Promise((resolve, reject) => {
|
|
107
|
+
this.logger.info(`Downloading with curl: ${url}`);
|
|
108
|
+
const curl = (0, child_process_1.exec)(`curl -L -o "${destPath}" "${url}"`, (error) => {
|
|
109
|
+
if (error) {
|
|
110
|
+
reject(error);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
resolve();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
if (curl.stdout) {
|
|
117
|
+
curl.stdout.on('data', (data) => {
|
|
118
|
+
process.stdout.write(data);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (curl.stderr) {
|
|
122
|
+
curl.stderr.on('data', (data) => {
|
|
123
|
+
process.stderr.write(data);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
132
126
|
});
|
|
133
|
-
await fs.remove(tarPath);
|
|
134
|
-
await fs.chmod(javaBin, 0o755);
|
|
135
|
-
this.logger.success(`Portable Java ${version} installed at ${javaBin}`);
|
|
136
|
-
const versionOutput = (0, child_process_1.execSync)(`"${javaBin}" -version 2>&1`).toString();
|
|
137
|
-
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
138
|
-
return {
|
|
139
|
-
path: javaBin,
|
|
140
|
-
version: version,
|
|
141
|
-
type: 'portable'
|
|
142
|
-
};
|
|
143
127
|
}
|
|
144
|
-
static
|
|
128
|
+
static async downloadWithWget(url, destPath) {
|
|
145
129
|
return new Promise((resolve, reject) => {
|
|
146
|
-
this.logger.info(`Downloading
|
|
147
|
-
const
|
|
148
|
-
|
|
130
|
+
this.logger.info(`Downloading with wget: ${url}`);
|
|
131
|
+
const wget = (0, child_process_1.exec)(`wget -O "${destPath}" "${url}"`, (error) => {
|
|
132
|
+
if (error) {
|
|
133
|
+
reject(error);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
resolve();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
if (wget.stdout) {
|
|
140
|
+
wget.stdout.on('data', (data) => {
|
|
141
|
+
process.stdout.write(data);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (wget.stderr) {
|
|
145
|
+
wget.stderr.on('data', (data) => {
|
|
146
|
+
process.stderr.write(data);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
static async downloadWithNode(url, destPath) {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
154
|
+
const request = protocol.get(url, (response) => {
|
|
155
|
+
if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308) {
|
|
156
|
+
const location = response.headers.location;
|
|
157
|
+
if (location) {
|
|
158
|
+
this.logger.info(`Redirecting to ${location}`);
|
|
159
|
+
this.downloadWithNode(location, destPath).then(resolve).catch(reject);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
149
163
|
if (response.statusCode !== 200) {
|
|
150
164
|
reject(new Error(`Download failed: ${response.statusCode}`));
|
|
151
165
|
return;
|
|
152
166
|
}
|
|
167
|
+
const file = fs.createWriteStream(destPath);
|
|
153
168
|
const totalSize = parseInt(response.headers['content-length'] || '0');
|
|
154
169
|
let downloadedSize = 0;
|
|
155
170
|
response.on('data', (chunk) => {
|
|
156
171
|
downloadedSize += chunk.length;
|
|
157
172
|
if (totalSize > 0) {
|
|
158
173
|
const percent = ((downloadedSize / totalSize) * 100).toFixed(1);
|
|
159
|
-
process.stdout.write(`\rDownloading Java: ${percent}% (${(downloadedSize / 1024 / 1024).toFixed(1)} MB
|
|
174
|
+
process.stdout.write(`\rDownloading Java: ${percent}% (${(downloadedSize / 1024 / 1024).toFixed(1)} MB)`);
|
|
160
175
|
}
|
|
161
176
|
});
|
|
162
177
|
response.pipe(file);
|
|
@@ -169,12 +184,87 @@ class JavaChecker {
|
|
|
169
184
|
fs.unlink(destPath).catch(() => { });
|
|
170
185
|
reject(err);
|
|
171
186
|
});
|
|
172
|
-
})
|
|
187
|
+
});
|
|
188
|
+
request.on('error', (err) => {
|
|
173
189
|
fs.unlink(destPath).catch(() => { });
|
|
174
190
|
reject(err);
|
|
175
191
|
});
|
|
192
|
+
request.end();
|
|
176
193
|
});
|
|
177
194
|
}
|
|
195
|
+
static async downloadWithFallback(url, destPath) {
|
|
196
|
+
const downloaders = [
|
|
197
|
+
this.downloadWithCurl.bind(this),
|
|
198
|
+
this.downloadWithWget.bind(this),
|
|
199
|
+
this.downloadWithNode.bind(this)
|
|
200
|
+
];
|
|
201
|
+
for (const downloader of downloaders) {
|
|
202
|
+
try {
|
|
203
|
+
await downloader(url, destPath);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
208
|
+
this.logger.warning(`Download method failed: ${errorMessage}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
throw new Error('All download methods failed');
|
|
212
|
+
}
|
|
213
|
+
static async getOrDownloadPortableJava(version = '17') {
|
|
214
|
+
await fs.ensureDir(this.JAVA_DIR);
|
|
215
|
+
const javaHome = path.join(this.JAVA_DIR, `jre-${version}`);
|
|
216
|
+
const javaBin = path.join(javaHome, 'bin', 'java');
|
|
217
|
+
if (await fs.pathExists(javaBin)) {
|
|
218
|
+
this.logger.info(`Portable Java ${version} already exists at ${javaBin}`);
|
|
219
|
+
try {
|
|
220
|
+
const versionOutput = (0, child_process_1.execSync)(`"${javaBin}" -version 2>&1`).toString();
|
|
221
|
+
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
222
|
+
return {
|
|
223
|
+
path: javaBin,
|
|
224
|
+
version: version,
|
|
225
|
+
type: 'portable'
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
this.logger.warning(`Existing Java seems corrupted, re-downloading...`);
|
|
230
|
+
await fs.remove(javaHome);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const urls = this.JAVA_URLS[version] || this.JAVA_URLS['17'];
|
|
234
|
+
let lastError = null;
|
|
235
|
+
for (let i = 0; i < urls.length; i++) {
|
|
236
|
+
const url = urls[i];
|
|
237
|
+
const tarPath = path.join(this.JAVA_DIR, `jre-${version}-${i}.tar.gz`);
|
|
238
|
+
try {
|
|
239
|
+
this.logger.info(`Downloading portable Java ${version} (attempt ${i + 1}/${urls.length})...`);
|
|
240
|
+
this.logger.info(`URL: ${url}`);
|
|
241
|
+
await this.downloadWithFallback(url, tarPath);
|
|
242
|
+
this.logger.info(`Extracting Java ${version}...`);
|
|
243
|
+
await fs.ensureDir(javaHome);
|
|
244
|
+
await tar.extract({
|
|
245
|
+
file: tarPath,
|
|
246
|
+
cwd: javaHome,
|
|
247
|
+
strip: 1
|
|
248
|
+
});
|
|
249
|
+
await fs.remove(tarPath);
|
|
250
|
+
await fs.chmod(javaBin, 0o755);
|
|
251
|
+
this.logger.success(`Portable Java ${version} installed at ${javaBin}`);
|
|
252
|
+
const versionOutput = (0, child_process_1.execSync)(`"${javaBin}" -version 2>&1`).toString();
|
|
253
|
+
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
254
|
+
return {
|
|
255
|
+
path: javaBin,
|
|
256
|
+
version: version,
|
|
257
|
+
type: 'portable'
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
262
|
+
this.logger.warning(`Attempt ${i + 1} failed: ${lastError.message}`);
|
|
263
|
+
await fs.remove(tarPath).catch(() => { });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
throw new Error(`Failed to download Java ${version} after ${urls.length} attempts. Last error: ${lastError?.message}`);
|
|
267
|
+
}
|
|
178
268
|
static async ensureJava(version = 'auto', usePortable = true) {
|
|
179
269
|
const targetVersion = version === 'auto' ? '17' : version;
|
|
180
270
|
if (!usePortable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JavaChecker.js","sourceRoot":"","sources":["../../src/core/JavaChecker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JavaChecker.js","sourceRoot":"","sources":["../../src/core/JavaChecker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/core/JavaChecker.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { execSync, exec } from 'child_process';
|
|
|
2
2
|
import * as fs from 'fs-extra';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as https from 'https';
|
|
5
|
+
import * as http from 'http';
|
|
5
6
|
import * as tar from 'tar';
|
|
6
7
|
import { Logger } from '../utils/Logger';
|
|
7
8
|
|
|
@@ -14,10 +15,23 @@ export interface JavaInfo {
|
|
|
14
15
|
export class JavaChecker {
|
|
15
16
|
private static logger = Logger.getInstance();
|
|
16
17
|
private static readonly JAVA_DIR = path.join('/tmp', '.mc-headless-java');
|
|
17
|
-
|
|
18
|
-
private static readonly
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
|
|
19
|
+
private static readonly JAVA_URLS = {
|
|
20
|
+
'21': [
|
|
21
|
+
'https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz',
|
|
22
|
+
'https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.2%2B13/OpenJDK21U-jdk_x64_linux_hotspot_21.0.2_13.tar.gz'
|
|
23
|
+
],
|
|
24
|
+
'17': [
|
|
25
|
+
'https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz',
|
|
26
|
+
'https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz'
|
|
27
|
+
],
|
|
28
|
+
'11': [
|
|
29
|
+
'https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz'
|
|
30
|
+
],
|
|
31
|
+
'8': [
|
|
32
|
+
'https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u402-b06/OpenJDK8U-jdk_x64_linux_hotspot_8u402b06.tar.gz'
|
|
33
|
+
]
|
|
34
|
+
};
|
|
21
35
|
|
|
22
36
|
public static async checkJava(): Promise<boolean> {
|
|
23
37
|
return new Promise((resolve) => {
|
|
@@ -57,84 +71,78 @@ export class JavaChecker {
|
|
|
57
71
|
}
|
|
58
72
|
}
|
|
59
73
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const javaHome = path.join(this.JAVA_DIR, `jre-${version}`);
|
|
64
|
-
const javaBin = path.join(javaHome, 'bin', 'java');
|
|
65
|
-
|
|
66
|
-
if (await fs.pathExists(javaBin)) {
|
|
67
|
-
this.logger.info(`Portable Java ${version} already exists at ${javaBin}`);
|
|
74
|
+
private static async downloadWithCurl(url: string, destPath: string): Promise<void> {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
this.logger.info(`Downloading with curl: ${url}`);
|
|
68
77
|
|
|
69
|
-
const
|
|
70
|
-
|
|
78
|
+
const curl = exec(`curl -L -o "${destPath}" "${url}"`, (error) => {
|
|
79
|
+
if (error) {
|
|
80
|
+
reject(error);
|
|
81
|
+
} else {
|
|
82
|
+
resolve();
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
if (curl.stdout) {
|
|
87
|
+
curl.stdout.on('data', (data) => {
|
|
88
|
+
process.stdout.write(data);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (curl.stderr) {
|
|
93
|
+
curl.stderr.on('data', (data) => {
|
|
94
|
+
process.stderr.write(data);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private static async downloadWithWget(url: string, destPath: string): Promise<void> {
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
this.logger.info(`Downloading with wget: ${url}`);
|
|
71
103
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
104
|
+
const wget = exec(`wget -O "${destPath}" "${url}"`, (error) => {
|
|
105
|
+
if (error) {
|
|
106
|
+
reject(error);
|
|
107
|
+
} else {
|
|
108
|
+
resolve();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
78
111
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
downloadUrl = this.JAVA_21_URL;
|
|
85
|
-
break;
|
|
86
|
-
case '17':
|
|
87
|
-
downloadUrl = this.JAVA_17_URL;
|
|
88
|
-
break;
|
|
89
|
-
case '11':
|
|
90
|
-
downloadUrl = this.JAVA_11_URL;
|
|
91
|
-
break;
|
|
92
|
-
case '8':
|
|
93
|
-
downloadUrl = this.JAVA_8_URL;
|
|
94
|
-
break;
|
|
95
|
-
default:
|
|
96
|
-
downloadUrl = this.JAVA_17_URL;
|
|
97
|
-
}
|
|
112
|
+
if (wget.stdout) {
|
|
113
|
+
wget.stdout.on('data', (data) => {
|
|
114
|
+
process.stdout.write(data);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
98
117
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
await fs.ensureDir(javaHome);
|
|
105
|
-
await tar.extract({
|
|
106
|
-
file: tarPath,
|
|
107
|
-
cwd: javaHome,
|
|
108
|
-
strip: 1
|
|
118
|
+
if (wget.stderr) {
|
|
119
|
+
wget.stderr.on('data', (data) => {
|
|
120
|
+
process.stderr.write(data);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
109
123
|
});
|
|
110
|
-
|
|
111
|
-
await fs.remove(tarPath);
|
|
112
|
-
|
|
113
|
-
await fs.chmod(javaBin, 0o755);
|
|
114
|
-
|
|
115
|
-
this.logger.success(`Portable Java ${version} installed at ${javaBin}`);
|
|
116
|
-
|
|
117
|
-
const versionOutput = execSync(`"${javaBin}" -version 2>&1`).toString();
|
|
118
|
-
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
path: javaBin,
|
|
122
|
-
version: version,
|
|
123
|
-
type: 'portable'
|
|
124
|
-
};
|
|
125
124
|
}
|
|
126
125
|
|
|
127
|
-
private static
|
|
126
|
+
private static async downloadWithNode(url: string, destPath: string): Promise<void> {
|
|
128
127
|
return new Promise((resolve, reject) => {
|
|
129
|
-
|
|
128
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
130
129
|
|
|
131
|
-
const
|
|
132
|
-
|
|
130
|
+
const request = protocol.get(url, (response) => {
|
|
131
|
+
if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308) {
|
|
132
|
+
const location = response.headers.location;
|
|
133
|
+
if (location) {
|
|
134
|
+
this.logger.info(`Redirecting to ${location}`);
|
|
135
|
+
this.downloadWithNode(location, destPath).then(resolve).catch(reject);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
133
140
|
if (response.statusCode !== 200) {
|
|
134
141
|
reject(new Error(`Download failed: ${response.statusCode}`));
|
|
135
142
|
return;
|
|
136
143
|
}
|
|
137
144
|
|
|
145
|
+
const file = fs.createWriteStream(destPath);
|
|
138
146
|
const totalSize = parseInt(response.headers['content-length'] || '0');
|
|
139
147
|
let downloadedSize = 0;
|
|
140
148
|
|
|
@@ -142,7 +150,7 @@ export class JavaChecker {
|
|
|
142
150
|
downloadedSize += chunk.length;
|
|
143
151
|
if (totalSize > 0) {
|
|
144
152
|
const percent = ((downloadedSize / totalSize) * 100).toFixed(1);
|
|
145
|
-
process.stdout.write(`\rDownloading Java: ${percent}% (${(downloadedSize / 1024 / 1024).toFixed(1)} MB
|
|
153
|
+
process.stdout.write(`\rDownloading Java: ${percent}% (${(downloadedSize / 1024 / 1024).toFixed(1)} MB)`);
|
|
146
154
|
}
|
|
147
155
|
});
|
|
148
156
|
|
|
@@ -158,13 +166,106 @@ export class JavaChecker {
|
|
|
158
166
|
fs.unlink(destPath).catch(() => {});
|
|
159
167
|
reject(err);
|
|
160
168
|
});
|
|
161
|
-
})
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
request.on('error', (err) => {
|
|
162
172
|
fs.unlink(destPath).catch(() => {});
|
|
163
173
|
reject(err);
|
|
164
174
|
});
|
|
175
|
+
|
|
176
|
+
request.end();
|
|
165
177
|
});
|
|
166
178
|
}
|
|
167
179
|
|
|
180
|
+
private static async downloadWithFallback(url: string, destPath: string): Promise<void> {
|
|
181
|
+
const downloaders = [
|
|
182
|
+
this.downloadWithCurl.bind(this),
|
|
183
|
+
this.downloadWithWget.bind(this),
|
|
184
|
+
this.downloadWithNode.bind(this)
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
for (const downloader of downloaders) {
|
|
188
|
+
try {
|
|
189
|
+
await downloader(url, destPath);
|
|
190
|
+
return;
|
|
191
|
+
} catch (error) {
|
|
192
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
193
|
+
this.logger.warning(`Download method failed: ${errorMessage}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
throw new Error('All download methods failed');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public static async getOrDownloadPortableJava(version: '17' | '21' | '11' | '8' = '17'): Promise<JavaInfo> {
|
|
201
|
+
await fs.ensureDir(this.JAVA_DIR);
|
|
202
|
+
|
|
203
|
+
const javaHome = path.join(this.JAVA_DIR, `jre-${version}`);
|
|
204
|
+
const javaBin = path.join(javaHome, 'bin', 'java');
|
|
205
|
+
|
|
206
|
+
if (await fs.pathExists(javaBin)) {
|
|
207
|
+
this.logger.info(`Portable Java ${version} already exists at ${javaBin}`);
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
const versionOutput = execSync(`"${javaBin}" -version 2>&1`).toString();
|
|
211
|
+
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
212
|
+
return {
|
|
213
|
+
path: javaBin,
|
|
214
|
+
version: version,
|
|
215
|
+
type: 'portable'
|
|
216
|
+
};
|
|
217
|
+
} catch (error) {
|
|
218
|
+
this.logger.warning(`Existing Java seems corrupted, re-downloading...`);
|
|
219
|
+
await fs.remove(javaHome);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const urls = this.JAVA_URLS[version] || this.JAVA_URLS['17'];
|
|
224
|
+
let lastError: Error | null = null;
|
|
225
|
+
|
|
226
|
+
for (let i = 0; i < urls.length; i++) {
|
|
227
|
+
const url = urls[i];
|
|
228
|
+
const tarPath = path.join(this.JAVA_DIR, `jre-${version}-${i}.tar.gz`);
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
this.logger.info(`Downloading portable Java ${version} (attempt ${i + 1}/${urls.length})...`);
|
|
232
|
+
this.logger.info(`URL: ${url}`);
|
|
233
|
+
|
|
234
|
+
await this.downloadWithFallback(url, tarPath);
|
|
235
|
+
|
|
236
|
+
this.logger.info(`Extracting Java ${version}...`);
|
|
237
|
+
await fs.ensureDir(javaHome);
|
|
238
|
+
await tar.extract({
|
|
239
|
+
file: tarPath,
|
|
240
|
+
cwd: javaHome,
|
|
241
|
+
strip: 1
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
await fs.remove(tarPath);
|
|
245
|
+
|
|
246
|
+
await fs.chmod(javaBin, 0o755);
|
|
247
|
+
|
|
248
|
+
this.logger.success(`Portable Java ${version} installed at ${javaBin}`);
|
|
249
|
+
|
|
250
|
+
const versionOutput = execSync(`"${javaBin}" -version 2>&1`).toString();
|
|
251
|
+
this.logger.debug(`Portable Java version: ${versionOutput.split('\n')[0]}`);
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
path: javaBin,
|
|
255
|
+
version: version,
|
|
256
|
+
type: 'portable'
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
} catch (error) {
|
|
260
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
261
|
+
this.logger.warning(`Attempt ${i + 1} failed: ${lastError.message}`);
|
|
262
|
+
await fs.remove(tarPath).catch(() => {});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
throw new Error(`Failed to download Java ${version} after ${urls.length} attempts. Last error: ${lastError?.message}`);
|
|
267
|
+
}
|
|
268
|
+
|
|
168
269
|
public static async ensureJava(version: '17' | '21' | 'auto' = 'auto', usePortable: boolean = true): Promise<JavaInfo> {
|
|
169
270
|
const targetVersion = version === 'auto' ? '17' : version;
|
|
170
271
|
|