跳到主要内容

vscode-java-配置

vscode 配置java 版本

  • 安装低版本java, 项目用的java太低了, 用高版本java还会出现各种奇怪的问题
sdk install java 8.0.302-open  
sdk install maven 3.6.3
  • 还得安装高版本java, vscode很多插件要求最低是java 11
sdk install java 11.0.12-open 
  • 其他报错
No delegateCommandHandler for vscode.java.validateLaunchConfig" Error

执行重新编译, 重启启动vscode, 问题解决.

  • 目前配置的vscode的settings.json

配置java runtime, 主要的报错来自sonarlint这个插件, 还有springboot插件.

{
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m -Xlog:disable -javaagent:\"/projects/.vscode-remote/extensions/gabrielbb.vscode-lombok-1.0.1-universal/server/lombok.jar\"",
"java.configuration.runtimes": [
{
"name": "JavaSE-11",
"path": "/root/.sdkman/candidates/java/11.0.12-open/"
},
{
"name": "JavaSE-1.8",
"path": "/root/.sdkman/candidates/java//8.0.302-open/"
},
],
"spring-boot.ls.java.home": "/root/.sdkman/candidates/java/11.0.12-open/",
"sonarlint.ls.javaHome": "/root/.sdkman/candidates/java/11.0.12-open/",

}

vscode web 版本报错 sonar jdk问题

vscode web 远程版本, 经常出现的问题是vscode jdk runtime和sonalint jdk问题.

picture 0

以前本地vscode有设置过, 在 User>settings.json里配置

{ "sonarlint.ls.javaHome": "/data/home/geehanlin/.sdkman/candidates/java/17.0.8-kona/" }

但是提示不生效, 报错 This setting cannot be applied in this window. It will be applied when you open a local window.

好像是因为安全原因, 需要在远程机器的专属配置上设置才行, 需要在remote/settings.json里配置才能生效

可以在vscode里直接设置, 看起来具体位置是/etc/.gf-ide/gee/.ide-server/data/Machine/settings.json.

picture 1

{
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m -Xlog:disable -javaagent:\"/etc/.gf-ide/gee/.ide-server/extensions/gabrielbb.vscode-lombok-1.0.1-universal/server/lombok.jar\"",
"java.jdt.ls.java.home": "/data/home/geehanlin/.sdkman/candidates/java/17.0.8-kona",
"sonarlint.ls.javaHome": "/data/home/geehanlin/.sdkman/candidates/java/17.0.8-kona/"
}

安全原因

This setting can only be applied in user settings in local window or in remote settings in remote window #539

https://github.com/microsoft/vscode-maven/issues/539

https://github.com/microsoft/vscode-maven/releases/tag/v0.24.0

vscode java 插件功能不生效问题

使用vscode开发java, 经常出现java代码无法跳转, java插件不生效, 插件生效却报错java runtime版本不对等问题, 比java idea的无脑使用麻烦许多. 不过多看看插件的说明文档和报错信息, 掌握常见的处理方法, vscode开发java也能很顺手, 开启浏览器开发的新时代.

插件不生效问题

java源码无法跳转, java test函数也无法被识别, 没有出现标记.

右下角的java编译状态出现报错

picture 6

command + p 的java force命令全部找不到, 只能到插件的说明页面查看快捷方式

picture 2

点击查看build log发现有如下报错信息

!MESSAGE Failed to scan /home/coder/project/ranger
!STACK 0
java.nio.file.AccessDeniedException: /home/coder/project/ranger/dev-support/ranger-docker/postgres-db-mount/pg_multixact
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystemProvider.readAttributes(Unknown Source)
at java.base/sun.nio.fs.LinuxFileSystemProvider.readAttributes(Unknown Source)
at java.base/java.nio.file.Files.readAttributes(Unknown Source)
at java.base/java.nio.file.FileTreeWalker.getAttributes(Unknown Source)
at java.base/java.nio.file.FileTreeWalker.visit(Unknown Source)
at java.base/java.nio.file.FileTreeWalker.next(Unknown Source)
at java.base/java.nio.file.Files.walkFileTree(Unknown Source)
at org.eclipse.jdt.ls.core.internal.managers.BasicFileDetector.scanDir(BasicFileDetector.java:178)
at org.eclipse.jdt.ls.core.internal.managers.BasicFileDetector.scan(BasicFileDetector.java:138)
at org.eclipse.jdt.ls.core.internal.managers.GradleProjectImporter.applies(GradleProjectImporter.java:154)
at org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.importProjects(ProjectsManager.java:149)
at org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.initializeProjects(ProjectsManager.java:112)
at org.eclipse.jdt.ls.core.internal.handlers.InitHandler$1.runInWorkspace(InitHandler.java:254)
at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:43)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

查看client.log, 也有相同的报错信息

{
message: 'SLF4J: Defaulting to no-operation (NOP) logger implementation\n' +
'SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.\n',
level: 'info',
timestamp: '2023-07-12 20:48:16.759'
}
{
message: '[Error - 8:48:27 PM] Jul 12, 2023, 8:48:27 PM Initialization failed \n' +
'Failed to import projects\n' +
'org.eclipse.core.runtime.CoreException: Failed to import projects\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.importProjects(ProjectsManager.java:162)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.initializeProjects(ProjectsManager.java:112)\n' +
'\tat org.eclipse.jdt.ls.core.internal.handlers.InitHandler$1.runInWorkspace(InitHandler.java:254)\n' +
'\tat org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:43)\n' +
'\tat org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)\n' +
'Contains: Failed to scan /home/coder/project/ranger\n' +
'java.nio.file.AccessDeniedException: /home/coder/project/ranger/dev-support/ranger-docker/postgres-db-mount/pg_multixact\n' +
'\tat java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)\n' +
'\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)\n' +
'\tat java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)\n' +
'\tat java.base/sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(Unknown Source)\n' +
'\tat java.base/sun.nio.fs.UnixFileSystemProvider.readAttributes(Unknown Source)\n' +
'\tat java.base/sun.nio.fs.LinuxFileSystemProvider.readAttributes(Unknown Source)\n' +
'\tat java.base/java.nio.file.Files.readAttributes(Unknown Source)\n' +
'\tat java.base/java.nio.file.FileTreeWalker.getAttributes(Unknown Source)\n' +
'\tat java.base/java.nio.file.FileTreeWalker.visit(Unknown Source)\n' +
'\tat java.base/java.nio.file.FileTreeWalker.next(Unknown Source)\n' +
'\tat java.base/java.nio.file.Files.walkFileTree(Unknown Source)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.BasicFileDetector.scanDir(BasicFileDetector.java:178)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.BasicFileDetector.scan(BasicFileDetector.java:138)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.GradleProjectImporter.applies(GradleProjectImporter.java:154)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.importProjects(ProjectsManager.java:149)\n' +
'\tat org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.initializeProjects(ProjectsManager.java:112)\n' +
'\tat org.eclipse.jdt.ls.core.internal.handlers.InitHandler$1.runInWorkspace(InitHandler.java:254)\n' +
'\tat org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:43)\n' +
'\tat org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)\n',
level: 'info',
timestamp: '2023-07-12 20:48:27.147'
}
{
message: "Failed to provide hover command Error: The request (id: 116, method: 'java/findLinks') has been cancelled",
level: 'error',
timestamp: '2023-07-12 21:05:58.398'
}

看起来其实就是某个路径无法被访问, 这个路径是ranger docker安装postgresql数据库的地址, 只有root账号能访问.

drwxrwxr-x  2 ubuntu  999 4.0K Jul 11 23:03 patches
drwxrw-r-- 19 999 root 4.0K Jul 12 12:20 postgres-db-mount
-rw-rw-r-- 1 ubuntu 999 3.9K Jul 11 23:03 README.md
/home/coder/project/ranger/dev-support/ranger-docker/postgres-db-mount^C

处理忽略文件夹

搜索了一下, 发现原来可以配置vscode的java插件不处理某些文件夹.

配置 import exclusion

picture 1

  • settings.json

这种跟某个项目关联的配置, 可以配置在workspace.settings.json中.

node_model等都是自带的, 额外新增了**/ranger-docker/**.

{
"workbench.colorTheme": "Default Dark Modern",
"task.allowAutomaticTasks": "off",
"java.eclipse.downloadSources": true,
"java.maven.downloadSources": true,
"java.import.exclusions": [
"**/node_modules/**",
"**/.metadata/**",
"**/archetype-resources/**",
"**/META-INF/maven/**",
"**/ranger-docker/**"
]
}

修改后, 执行 reload window 成功修复.

command + shift + p可以调用出java插件命令

picture 3

test函数也都自动找到并进行标记了

picture 4

同时额外配置maven下载源代码, 这样估计就能实现跟idea一样跳转源码了

picture 5

Ignore folder from workspace

https://github.com/microsoft/vscode-java-debug/issues/814

还能够配置某些文件夹为资源文件夹, 不需要每次都进行编译

https://stackoverflow.com/questions/61219981/how-to-ignore-files-from-the-java-build-in-vscode

java test 测试

安装插件"Test Runner for Java", 就可以在web vscode中直接运行某个测试, 并在debug output里查看运行时候的output输出.

picture 0

vscode java 红线无法跳转问题

2023-06-09

vscode打开代码, 很多时候会出现一堆红线报错无法找到依赖的情况.

picture 1

首先是确认 ~/.m2/settings.xm 里的仓库配置, 确保mvn clean package能成功编译, 所有内部外部依赖确实是能找到的.

然后 Command + Shift + P 弹出 vscode 的命令控制模式, 执行三件套都试一试, 基本就能解决了.

Java: Rebuild Projects
Java: Reload Projects
Java: Force Java Compilation

picture 2

在JavaOverview里的TipsForBeginners里, 里面也能看到详细说明

picture 3

依赖jar包有问题导致无法跳转

maven使用的jar包如果有问题的话, 代码也是红色看起来无法跳转.

具体问题定位可以切换到output tab, redhat java server输出日志部分, 查看日志可以看到哪些jar包有问题.


[Error - 12:00:34 PM] Sep 18, 2023, 12:00:34 PM Failed to index /root/.m2/repository/com/a/b/c.jar
zip END header not found
java.util.zip.ZipException: zip END header not found
at java.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1599)
at java.base/java.util.zip.ZipFile$Source.initCEN(ZipFile.java:1607)
at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1445)
at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1407)
at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:716)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:250)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:179)
at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:193)
at org.eclipse.jdt.internal.core.search.indexing.AddJarFileToIndex.execute(AddJarFileToIndex.java:161)
at org.eclipse.jdt.internal.core.search.processing.JobManager.indexerLoop(JobManager.java:524)
at java.base/java.lang.Thread.run(Thread.java:833)

判断一个jar包是否有问题, 可以尝试使用jar xf abc.jar去解压缩, 看看能不能成功. 本次遇到的情况是编译的jar包有问题, 解压缩后什么都没有.

created at 2023-07-12