redhat-developer / redhat-developer/vscode-java
When having VS Code open on a project that has a generated code srcDir, and running gradle commands from the command-line in that same folder, lock contention issues cause corrupted artifacts
Nessuno ha ancora preso questa issue.
- Lingua principale
- TypeScript
- Stelle
- 2.3k
- Fork
- 546
- Merge medio
- 20h 1m
- PR unite (30g)
- 11
Descrizione
Expected Behavior
I'm using VS Code 1.17.2 + vscode-java 0.12.0, gradle 4.2.1 to build a Java 8 SpringBoot application om macOS 10.12.6. The build uses an xjc ant task to generate .java files from a few .xsd documents in the resources directory. I've verified that in my case, 11 ObjectFactory.java files are generated, and consequently, 11 ObjectFactory.class files are compiled correctly. I would expect all of those class files to end up in my resulting .war artifact.
Current Behavior
A random number of ObjectFactory.class files end up in the .war file. To verify this, see how to reproduce below.
Context
The issue occurs when vscode is open on a project which contains a generated code folder, specified as a srcDir entry in the build.gradle, and a terminal on the same project is used to run gradle commands. It looks like gradle from the command-line is competing with vscode-java/eclipse-jdt-ls/buildship for locks on files.
Note that it has been observed that specifying options.fork in the compileJava {..} section also works around the problem, although I suspect that only happens due to timing (i.e, think this is a race condition/lock contention of sorts).
Steps to Reproduce
- Git clone reproducer (git clone git@github.com:rubin55/reproducer.git)
- Open reproducer as folder in vscode
- Let vscode initialize, open a few Java files to see that class lookup works
- In particular, open a .java file from the generated source folder
- Open a terminal and cd to the reproducer
- Run this, a few times in a row:
gradle clean build && echo I found $(unzip -l build/libs/*.war | grep ObjectFactory.class | wc -l) ObjectFactory objects in archive while $(find build/classes/ -type f -name ObjectFactory.class | wc -l) were compiled and $(find build/generated/ -type f -name ObjectFactory.java | wc -l) java files where generated
Example output:
I found 1 ObjectFactory objects in archive while 11 were compiled and 11 java files where generated
- If the issue manifests, you will see that the resultant .war file will have missing ObjectFactory.class files (see message above).
- Observe vscode-java .log file and see backtraces that coincide with this issue. See attached vscode-java.log.
Your Environment
VS Code 1.17.2
VS Code Java 0.12.0
Gradle 4.2.1
Java 8 r144
macOS 10.12.6
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia dal repository di riproduzione, dal relativo build.gradle e dalla directory del codice sorgente generato descritta nel report. Esegui ripetutamente il comando gradle clean build mentre VS Code e vscode-java sono aperti, quindi confronta i file Java generati, le classi compilate e i contenuti del WAR; esamina il vscode-java.log allegato per individuare i backtrace corrispondenti. Il lavoro è completato quando la build riprodotta include sistematicamente tutti i file ObjectFactory.class generati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java, vscode
- Ambito
- build-system, developer-experience, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100