Skip to content

Commit a381495

Browse files
committed
Adding support for eclipse.jdt.ls
1 parent 534a665 commit a381495

File tree

17 files changed

+255
-20
lines changed

17 files changed

+255
-20
lines changed

.dockerignore

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
# Linked packages are problematic during build, npm i during start will fix it
2-
node_modules/@typefox/monaco-editor-react
3-
node_modules/example-client-vite
4-
node_modules/example-client-webpack
5-
node_modules/monaco-languageclient
6-
node_modules/monaco-editor-wrapper
7-
node_modules/monaco-languageclient-examples
8-
node_modules/vscode-ws-jsonrpc
1+
## Linked packages are problematic during build, npm i during start will fix it
2+
#node_modules/@typefox/monaco-editor-react
3+
#node_modules/example-client-vite
4+
#node_modules/example-client-webpack
5+
#node_modules/monaco-languageclient
6+
#node_modules/monaco-editor-wrapper
7+
#node_modules/monaco-languageclient-examples
8+
#node_modules/vscode-ws-jsonrpc
9+
10+
node_modules

index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ <h3>Python</h3>
4444
Please execute <b><code>npm run start:example:server:python</code></b> beforehand:<br>
4545
<a href="./packages/examples/python.html">Python Language Client & Pyright Language Server (Web Socket)</a><br>
4646

47+
<h3>Java</h3>
48+
Requires docker. Please execute <b><code>docker compose -f ./packages/examples/resources/eclipse.jdt.ls/docker-compose.yml up -d</code></b> beforehand:<br>
49+
<a href="./packages/examples/eclipse.jdt.ls.html">Java Language Client & Language Server (Web Socket)</a>
50+
<br>
51+
4752
<h3>Groovy</h3>
4853
Requires docker. Please execute <b><code>docker compose -f ./packages/examples/resources/groovy/docker-compose.yml up -d</code></b> beforehand:<br>
4954
<a href="./packages/examples/groovy.html">Groovy Language Client & Language Server (Web Socket)</a>

package-lock.json

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"start:example:server:json": "npm run start:server:json --workspace packages/examples",
5454
"start:example:server:python": "npm run start:server:python --workspace packages/examples",
5555
"start:example:server:groovy": "npm run start:server:groovy --workspace packages/examples",
56+
"start:example:server:jdtls": "npm run start:server:jdtls --workspace packages/examples",
5657
"release:prepare": "npm run reset:repo && npm ci && npm run build && npm run lint && npm run test:run",
5758
"reset:repo": "git clean -f -X -d",
5859
"test": "vitest",

packages/examples/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
resources/groovy/external
2+
resources/eclipse.jdt.ls/ls
3+
resources/eclipse.jdt.ls/*.tar.gz
24
resources/vsix

packages/examples/eclipse.jdt.ls.html

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html>
3+
4+
<head>
5+
<title>Java Language Client & Language Server (Web Socket)</title>
6+
<meta charset="utf-8">
7+
<meta name="viewport" content="width=device-width, initial-scale=1">
8+
<link rel="stylesheet" href="style.css">
9+
</head>
10+
11+
<body>
12+
<h2>Java Language Client & Language Server (Web Socket)</h2>
13+
<button type="button" id="button-start">Start</button>
14+
<button type="button" id="button-dispose">Dispose</button>
15+
<div id="monaco-editor-root" style="width:800px;height:600px;border:1px solid grey"></div>
16+
<script type="module">
17+
import { configureMonacoWorkers, runEclipseJdtLsClient } from "./src/eclipse.jdt.ls/client/main.ts";
18+
19+
configureMonacoWorkers();
20+
runEclipseJdtLsClient();
21+
</script>
22+
</body>
23+
24+
</html>

packages/examples/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"@codingame/monaco-vscode-keybindings-service-override": "~7.0.3",
6161
"@codingame/monaco-vscode-lifecycle-service-override": "~7.0.3",
6262
"@codingame/monaco-vscode-localization-service-override": "~7.0.3",
63+
"@codingame/monaco-vscode-java-default-extension": "~7.0.3",
6364
"@codingame/monaco-vscode-javascript-default-extension": "~7.0.3",
6465
"@codingame/monaco-vscode-json-default-extension": "~7.0.3",
6566
"@codingame/monaco-vscode-python-default-extension": "~7.0.3",
@@ -118,7 +119,8 @@
118119
"build:bundle": "vite --config vite.bundle.config.ts build",
119120
"start:server:json": "node --loader ts-node/esm src/json/server/direct.ts",
120121
"start:server:python": "node --loader ts-node/esm src/python/server/direct.ts",
121-
"start:server:groovy": "node --watch --loader ts-node/esm src/groovy/server/direct.ts",
122+
"start:server:groovy": "node --watch --loader ts-node/esm src/groovy/server/direct.ts",
123+
"start:server:jdtls": "vite-node src/eclipse.jdt.ls/server/direct.ts",
122124
"langium:generate": "langium generate --file ./src/langium/statemachine/config/langium-config.json"
123125
}
124126
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FROM eclipse-temurin:17-jdk
2+
3+
ARG MLC_PATH=/home/mlc
4+
ARG ECLIPSE_JDT_PATH=${MLC_PATH}/packages/examples/resources/eclipse.jdt.ls/ls
5+
ARG JDT_TAR_URL=https://download.eclipse.org/jdtls/milestones/1.37.0/jdt-language-server-1.37.0-202406271335.tar.gz
6+
ARG JDT_TAR_LOCAL=eclipse.jdt.ls.tar.gz
7+
8+
RUN apt update \
9+
&& apt upgrade -y
10+
RUN apt install -y wget
11+
12+
RUN curl https://get.volta.sh | bash
13+
ENV VOLTA_FEATURE_PNPM=1
14+
ENV VOLTA_HOME "/root/.volta"
15+
ENV PATH "$VOLTA_HOME/bin:$PATH"
16+
RUN volta install node@20
17+
18+
RUN mkdir -p ${MLC_PATH}
19+
20+
COPY ./ ${MLC_PATH}
21+
22+
RUN mkdir -p ${ECLIPSE_JDT_PATH} \
23+
&& cd ${ECLIPSE_JDT_PATH} \
24+
&& wget -O ${JDT_TAR_LOCAL} ${JDT_TAR_URL} \
25+
&& tar -xzf ${JDT_TAR_LOCAL}
26+
27+
WORKDIR ${MLC_PATH}
28+
29+
CMD ["/bin/bash", "npm i && npm run start:example:server:jdtls"]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
services:
2+
eclipsejdtls:
3+
build:
4+
dockerfile: ./packages/examples/resources/eclipse.jdt.ls/Dockerfile
5+
context: ../../../..
6+
environment:
7+
- MLC_PATH=/home/mlc
8+
- JDT_TAR_URL=https://download.eclipse.org/jdtls/milestones/1.37.0/jdt-language-server-1.37.0-202406271335.tar.gz
9+
- JDT_TAR_LOCAL=eclipse.jdt.ls.tar.gz
10+
command: [
11+
"bash", "-c", "npm i && npm run start:example:server:jdtls"
12+
]
13+
ports:
14+
- 30003:30003
15+
working_dir: /home/mlc
16+
container_name: eclipsejdtls
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
public static void main (String[] args) {
2+
System.out.println("Hello World!");
3+
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
FROM gradle:7-jdk17-focal
22

3+
ARG MLC_PATH=/home/gradle/mlc
4+
35
RUN apt update \
46
&& apt upgrade -y \
57
&& apt install -y ca-certificates curl gnupg unzip
68

7-
RUN mkdir -p /etc/apt/keyrings \
8-
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
9-
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
10-
&& apt update \
11-
&& apt install -y nodejs
9+
RUN curl https://get.volta.sh | bash
10+
ENV VOLTA_FEATURE_PNPM=1
11+
ENV VOLTA_HOME "/root/.volta"
12+
ENV PATH "$VOLTA_HOME/bin:$PATH"
13+
RUN volta install node@20
1214

1315
RUN git clone https://github.com/GroovyLanguageServer/groovy-language-server \
1416
&& cd groovy-language-server \
1517
&& ./gradlew build \
1618
&& cd ..
1719

18-
RUN mkdir -p /home/gradle/mlc
20+
RUN mkdir -p ${MLC_PATH}
1921

20-
COPY ./ /home/gradle/mlc/
22+
COPY ./ ${MLC_PATH}
2123

22-
WORKDIR /home/gradle/mlc
24+
WORKDIR ${MLC_PATH}

packages/examples/resources/groovy/docker-compose.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
version: '3'
2-
31
services:
42
groovyls:
53
build:
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2024 TypeFox and others.
3+
* Licensed under the MIT License. See LICENSE in the package root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
6+
import * as vscode from 'vscode';
7+
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
8+
// this is required syntax highlighting
9+
import '@codingame/monaco-vscode-java-default-extension';
10+
import { MonacoEditorLanguageClientWrapper, UserConfig } from 'monaco-editor-wrapper';
11+
import { useWorkerFactory } from 'monaco-editor-wrapper/workerFactory';
12+
import { RegisteredFileSystemProvider, RegisteredMemoryFile } from '@codingame/monaco-vscode-files-service-override';
13+
import helloJavaCode from '../../../resources/eclipse.jdt.ls/workspace/hello.java?raw';
14+
import { eclipseJdtLsConfig } from '../config';
15+
16+
export const configureMonacoWorkers = () => {
17+
useWorkerFactory({
18+
ignoreMapping: true,
19+
workerLoaders: {
20+
editorWorkerService: () => new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), { type: 'module' }),
21+
}
22+
});
23+
};
24+
25+
export const runEclipseJdtLsClient = () => {
26+
const helloJavaUri = vscode.Uri.file(`${eclipseJdtLsConfig.basePath}/workspace/hello.java`);
27+
const fileSystemProvider = new RegisteredFileSystemProvider(false);
28+
fileSystemProvider.registerFile(new RegisteredMemoryFile(helloJavaUri, helloJavaCode));
29+
30+
const userConfig: UserConfig = {
31+
wrapperConfig: {
32+
serviceConfig: {
33+
userServices: {
34+
...getKeybindingsServiceOverride(),
35+
},
36+
debugLogging: true
37+
},
38+
editorAppConfig: {
39+
$type: 'extended',
40+
codeResources: {
41+
main: {
42+
text: helloJavaCode,
43+
uri: `${eclipseJdtLsConfig.basePath}/workspace/hello.java`
44+
}
45+
},
46+
useDiffEditor: false,
47+
userConfiguration: {
48+
json: JSON.stringify({
49+
'workbench.colorTheme': 'Default Dark Modern',
50+
'editor.guides.bracketPairsHorizontal': 'active'
51+
})
52+
}
53+
}
54+
},
55+
languageClientConfig: {
56+
languageId: 'java',
57+
options: {
58+
$type: 'WebSocketUrl',
59+
url: 'ws://localhost:30003/jdtls'
60+
},
61+
clientOptions: {
62+
documentSelector: ['java'],
63+
workspaceFolder: {
64+
index: 0,
65+
name: 'workspace',
66+
uri: vscode.Uri.parse(`${eclipseJdtLsConfig.basePath}/workspace`)
67+
},
68+
},
69+
}
70+
};
71+
72+
const wrapper = new MonacoEditorLanguageClientWrapper();
73+
const htmlElement = document.getElementById('monaco-editor-root');
74+
75+
try {
76+
document.querySelector('#button-start')?.addEventListener('click', async () => {
77+
await wrapper.dispose();
78+
await wrapper.initAndStart(userConfig, htmlElement);
79+
});
80+
document.querySelector('#button-dispose')?.addEventListener('click', async () => {
81+
await wrapper.dispose();
82+
});
83+
} catch (e) {
84+
console.error(e);
85+
}
86+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2024 TypeFox and others.
3+
* Licensed under the MIT License. See LICENSE in the package root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
export const eclipseJdtLsConfig = {
6+
port: 30003,
7+
path: '/jdtls',
8+
basePath: '/home/mlc/packages/examples/resources/eclipse.jdt.ls'
9+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2024 TypeFox and others.
3+
* Licensed under the MIT License. See LICENSE in the package root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
6+
import { runEclipseJdtLs } from './main.js';
7+
8+
runEclipseJdtLs();
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2024 TypeFox and others.
3+
* Licensed under the MIT License. See LICENSE in the package root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
6+
import { runLanguageServer } from '../../common/node/language-server-runner.js';
7+
import { LanguageName } from '../../common/node/server-commons.js';
8+
import { eclipseJdtLsConfig } from '../config.js';
9+
10+
export const runEclipseJdtLs = () => {
11+
runLanguageServer({
12+
serverName: 'Eclipse JDT LS',
13+
pathName: eclipseJdtLsConfig.path,
14+
serverPort: eclipseJdtLsConfig.port,
15+
runCommand: LanguageName.java,
16+
runCommandArgs: [
17+
'-Declipse.application=org.eclipse.jdt.ls.core.id1',
18+
'-Dosgi.bundles.defaultStartLevel=4',
19+
'-Declipse.product=org.eclipse.jdt.ls.core.product',
20+
'-Dlog.level=ALL',
21+
'-Xmx1G',
22+
'--add-modules=ALL-SYSTEM',
23+
'--add-opens',
24+
'java.base/java.util=ALL-UNNAMED',
25+
'--add-opens',
26+
'java.base/java.lang=ALL-UNNAMED',
27+
'-jar',
28+
`${eclipseJdtLsConfig.basePath}/ls/plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar`,
29+
'-configuration',
30+
`${eclipseJdtLsConfig.basePath}/ls/config_linux`,
31+
'-data',
32+
`${eclipseJdtLsConfig.basePath}/workspace`
33+
],
34+
wsServerOptions: {
35+
noServer: true,
36+
perMessageDeflate: false
37+
}
38+
});
39+
};

packages/examples/src/groovy/client/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const configureMonacoWorkers = () => {
2020
};
2121

2222
const code = `package test.org;
23-
import java.io.File ;
23+
import java.io.File;
2424
File file = new File("E:/Example.txt");
2525
`;
2626

0 commit comments

Comments
 (0)