Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vscode-java fails to build project with pom-type dependency #3555

Open
kalaracey opened this issue Mar 29, 2024 · 8 comments
Open

vscode-java fails to build project with pom-type dependency #3555

kalaracey opened this issue Mar 29, 2024 · 8 comments

Comments

@kalaracey
Copy link

I am attempting to follow https://www.graalvm.org/latest/reference-manual/python/ in VSCode, but the Java Language Support for VSCode appears to be having some difficulty. Namely, it thinks the project cannot be built, while ./gradlew build succeeds just fine.

Environment
  • Operating System: macOS 13.6.1 (22G313)
  • JDK version:
    openjdk 21.0.2 2024-01-16
    OpenJDK Runtime Environment Homebrew (build 21.0.2)
    OpenJDK 64-Bit Server VM Homebrew (build 21.0.2, mixed mode, sharing)
  • Visual Studio Code version: 1.87.2 (Universal)
  • Java extension version: v1.28.1
  • Gradle 8.5
Steps To Reproduce
  1. git clone https://github.com/kalaracey/graalpy-vscode-issue.git
  2. Open graalpy-vscode-issue in VSCode
  3. Wait for the automatic "Opening Java Projects" to finish

Java Language Server log

Current Result

VSCode's Problems tab has two problems:

  • Archive for required library: '/Users/kal/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/python-community/23.1.2/2534a71914ae30007251d1f91f67bb5b5b3431d/python-community-23.1.2.pom' in project 'app' cannot be read or is not a valid ZIP file
  • The project cannot be built until build path errors are resolved
Screenshot 2024-03-29 at 11 15 05 AM
Expected Result

No problems, given that ./gradlew build succeeds.

Additional Informations

/Users/kal/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/python-community/23.1.2/2534a71914ae30007251d1f91f67bb5b5b3431d/python-community-23.1.2.pom is the only file in its directory.

Outputs from various VSCode tasks:

@kalaracey
Copy link
Author

FWIW, I noticed that when I Java: Configure Java Runtime, the type of project app is "Unmanaged folder", and not "Gradle" as I would have expected, but I don't know how to change that. Not sure if that's related.

Screenshot 2024-03-29 at 11 27 15 AM

@kalaracey
Copy link
Author

kalaracey commented Mar 29, 2024

Poking around /Users/kal/.gradle/caches/modules-2/files-2.1, I noticed something peculiar about org.graalvm.polyglot/python-community: it only includes a pom file, and no jars, unlike other dependencies.

I noticed that in the Maven setup for embedded GraalPy (see also here), <type>pom</type> is specified, i.e. the python-community is a "pom-type" dependency.

Searching for [jdt "pom dependency"] on Google reveals [jira] [Closed] (MCOMPILER-544) ZipException: zip END header not found on POM dependency with Eclipse compiler:

ZipException: zip END header not found on POM dependency with Eclipse compiler

There is an impedance matching issue between Maven Compiler Plugin, plexus-compiler-eclipse, and eclipse.jdt.core. m-c-p adds POM dependency's POM file to classpath, which makes it through plexus-compiler-eclipse to JDT and that prints an exception ZipException: zip END header not found. Arguably, m-c-p should not be adding non-JAR, non-wildcard-directory path to classpath for the compiler.

The issue seems to have been tracked in apache/maven-compiler-plugin#198 and codehaus-plexus/plexus-compiler#302.

@kalaracey
Copy link
Author

It looks like the issue was reported to the Eclipse JDT project (eclipse-jdt/eclipse.jdt.core#1274) but they closed the issue without a fix, and the fix was made in the Maven Compiler Plugin (see link in previous comment). IIUC, that would mean that a fix similar to apache/maven-compiler-plugin#198 would be needed in vscode-java.

As mitigation, I wonder if there is a way to get vscode-java to ignore certain dependencies, like the pom-type python-community dependency.

@kalaracey
Copy link
Author

There is another Eclipse JDT issue related to the Zip problem that is still open: eclipse-jdt/eclipse.jdt.core#1578

@kalaracey
Copy link
Author

Ok I have found a partial mitigation but it is not complete. I changed

    implementation("org.graalvm.polyglot:python:23.1.2")

in build.gradle.kts to

    implementation("org.graalvm.polyglot:python:23.1.2") {
        exclude(group = "org.graalvm.polyglot", module = "python-community")
    }

Running ./gradlew run still works (it prints "Hello Python!") but there are now some scary looking errors that indicate possible trouble with anything more complicated than a Hello World program:

[python::PythonContext] WARNING: could not determine Graal.Python's core path - you may need to pass --python.CoreHome.
[python::PythonContext] WARNING: could not determine Graal.Python's sys prefix path - you may need to pass --python.SysPrefix.
[python::PythonContext] WARNING: could not determine Graal.Python's standard library path. You need to pass --python.StdLibHome if you want to use the standard library.
[python::PythonContext] WARNING: could not determine Graal.Python's C API library path. You need to pass --python.CAPI if you want to use the C extension modules.
[python::PythonContext] WARNING: could not determine Graal.Python's C API library path. You need to pass --python.CAPI if you want to use the C extension modules.
[python::PythonContext] WARNING: could not determine Graal.Python's JNI library. You need to pass --python.JNILibrary if you want to run, for example, binary HPy extension modules.
[python::PythonContext] WARNING: could not determine Graal.Python's C API library path. You need to pass --python.CAPI if you want to use the C extension modules.
[python::PythonContext] WARNING: could not determine Graal.Python's C API library path. You need to pass --python.CAPI if you want to use the C extension modules.
[python::PythonContext] WARNING: could not determine Graal.Python's JNI library. You need to pass --python.JNILibrary if you want to run, for example, binary HPy extension modules.

@kalaracey
Copy link
Author

Adding /Users/kal/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/python-community/23.1.2/2534a71914ae30007251d1f91f67bb5b5b3431d/python-community-23.1.2.pom to java.project.referencedLibraries.exclude has no effect.

@kalaracey kalaracey changed the title vscode-java fails to build project, but gradle succeeds. vscode-java fails to build project with pom-type dependency Mar 29, 2024
@kalaracey
Copy link
Author

Ok here might be a better mitigation. It seems like the pom dependencies are just placeholders to pull in other, real dependencies. So I inspected the dependencies of

  • /Users/kal/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/python/23.1.2/85f926b2f5d99d5753d2ec925a1051b94ed0dff5/python-23.1.2.pom
  • /Users/kal/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/python-community/23.1.2/2534a71914ae30007251d1f91f67bb5b5b3431d/python-community-23.1.2.pom

and determined which ones looked like they were necessary. In build.gradle.kts I replaced

    implementation("org.graalvm.polyglot:python:23.1.2")

with

    implementation("org.graalvm.python:python-language:23.1.2")
    implementation("org.graalvm.python:python-resources:23.1.2")
    implementation("org.graalvm.truffle:truffle-runtime:23.1.2")

and the entries in the Problems pane that I reported appear to have gone away, and there is no discernible difference in the output of ./gradlew run.

It would still be great if the underlying problem of adding these pom-only dependencies to the class path (IIUC) could be fixed.

@kalaracey
Copy link
Author

Interestingly, vscode-java does not appear to suffer from this issue when using the example GraalPy Maven project (which can be set up with a single command), indicating the issue may be related to Gradle or how vscode-java is using Gradle.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant