I have a simple language server built in java using lsp4j, I am trying to built a vs code client extension using Yeoman.
When i run my extension.ts:
import * as vscode from 'vscode';
import * as path from 'path';
import { execSync } from 'child_process';
import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient/node';
export function activate(context: vscode.ExtensionContext) {
const logChannel = vscode.window.createOutputChannel("TOSCA_LSP");
logChannel.appendLine("Starting the TOSCA Language Server Extension!");
getJavaHome().then(javaHome => {
const executable = path.join(javaHome, 'bin', 'java');
const classPath = path.join('C:', 'Users', 'LAPTOP', 'Documents', 'GitHub', 'winery', 'org.eclipse.winery.lsp', 'build', 'libs', 'org.eclipse.winery.lsp-1.0-SNAPSHOT.jar');
//const args = ['-cp', classPath, 'org.eclipse.winery.lsp.Lancher.StdioLauncher.class'];
const args: string[] = ['-cp', classPath];
const main: string = 'org.eclipse.winery.lsp.Launcher.StdioLauncher';
logChannel.appendLine(`Java Executable: ${executable}`);
logChannel.appendLine(`Classpath: ${classPath}`);
logChannel.appendLine(`Args: ${args.join(' ')}`);
const serverOptions: ServerOptions = {
command: executable,
args: [...args, main],
options: {}
};
const clientOptions: LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'yaml' }],
synchronize: {
fileEvents: vscode.workspace.createFileSystemWatcher('**/*.yaml')
},
outputChannel: logChannel
};
const client = new LanguageClient('tosca-lang-client', 'TOSCA Language Server', serverOptions, clientOptions);
const disposable = client.start();
context.subscriptions.push(disposable);
}).catch(err => {
logChannel.appendLine('Error finding Java home: ' + err);
});
}
export function deactivate() {}
function getJavaHome(): Promise<string> {
const cmd = process.platform === 'win32' ?
'java -XshowSettings:properties -version 2>&1 | findstr "java.home"' :
"java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home'";
return new Promise((resolve, reject) => {
try {
const output = execSync(cmd).toString();
const javaHome = output.split('java.home =')[1].trim();
resolve(javaHome);
} catch (error) {
reject(error);
}
});
}
I get this error:
Error: Unable to initialize main class org.eclipse.winery.lsp.Launcher.StdioLauncher
Caused by: java.lang.NoClassDefFoundError: org/eclipse/lsp4j/services/LanguageServer
-
I have checked that my StdioLauncher class existance in my jar file, also copied my jar file absolute path to make sure that the path is correct.
-
I building my java project with gradle, I did tried to clean build my project to make sure the jar file is correct.
-
I have checked that my StdioLauncher class existance in my jar file, also copied my jar file absolute path to make sure that the path is correct.
-
I building my java project with gradle, I did tried to clean build my project to make sure the jar file is correct.
Omar Mohamed is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.