microsoft / vscode-java-debug

Java Debugger for Visual Studio Code.
Other
530 stars 339 forks source link

Debugger ignores spring boot application.properties #157

Closed amitmerin closed 6 years ago

amitmerin commented 7 years ago

Using the basic spring boot example app from https://github.com/microsoft/gs-spring-boot.git. I added the file 'src/main/resources/application.properties' with the following line server.port=8880 I run the debugger with the following Launch configuration: { "type": "java", "name": "Debug (Launch)-Application<complete>", "request": "launch", "cwd": "${workspaceFolder}", "mainClass": "hello.Application", "projectName": "complete", "args": "" } The debugger runs with the default port 8080 and ignores the application.properties file

amitmerin commented 7 years ago

The solution I found is sending the whole application.properties file inside the args of the configuration.

        {
            "type": "java",
            "name": "Debug (Launch)-Application<complete>",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "mainClass": "hello.Application",
            "projectName": "complete",
            "args": "server.port=8880"
        }

I think that when having many values in application.properties this becomes cumbersome.

akaroml commented 6 years ago

@Matthew-Dong please help get the clearance to make a fix in spring boot extension.

Matthew-Dong commented 6 years ago

Greetings,

Opened an issue in VSCode Spring Boot extension repo to ask Pivotal for advice.

https://github.com/spring-projects/sts4/issues/43

kdvolder commented 6 years ago

I was able to reproduce the problem. I'm will be doing a few little experiments to try and figure out exactly what the problem (or problems) might be. I'll report my findings here.

On first try it did exactly as the reporter said he did. To be precise these exact steps:

  1. clone the repo https://github.com/microsoft/gs-spring-boot.git
  2. cd gs-spring-boot/complete
  3. Open vscode code .
  4. create a folder at scr/main/resources
  5. add a file application.properties with server.port=8777.
  6. launch the project

Observations:

/home/kdvolder/tmp/gs-spring-boot/complete/bin
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-web/1.5.6.RELEASE/6f47b0a9e7e39b46b9e66ebdd2bff1c7edee5930/spring-boot-starter-web-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-actuator/1.5.6.RELEASE/39fc3d44c95ddf5ca4d0667384ffcbe8b3056d50/spring-boot-starter-actuator-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-test/1.5.6.RELEASE/a0e9b338bf492ddc68051e7d4ed62f2cbad067ef/spring-boot-starter-test-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/1.5.6.RELEASE/58c72d105fdf41f605c15c243b72300fa78cccd1/spring-boot-starter-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-tomcat/1.5.6.RELEASE/1d0960e91dfdad2b6b82700ba1613c006355669/spring-boot-starter-tomcat-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-validator/5.3.5.Final/622a9bcef2eed6d41b5b8e0662c36212009e375/hibernate-validator-5.3.5.Final.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.8.9/4dfca3975be3c1a98eacb829e70f02e9a71bc159/jackson-databind-2.8.9.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/4.3.10.RELEASE/6344501cb03cb4787c67cf3f820a471e07b9203b/spring-web-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-webmvc/4.3.10.RELEASE/6809017a5a76bdaf1957f1cc0a892d448fc6f3df/spring-webmvc-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-actuator/1.5.6.RELEASE/2a0e4f39d58078159c2929c039e7c7813b325871/spring-boot-actuator-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/1.5.6.RELEASE/7bf97882d08b0ae5f61e5a6ced99451663a02a5d/spring-boot-test-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/1.5.6.RELEASE/d4fdc79a4a1331718465ba4564a0a3555f1e0faa/spring-boot-test-autoconfigure-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.jayway.jsonpath/json-path/2.2.0/22290d17944bd239fabf5ac69005a60a7ecbbbcb/json-path-2.2.0.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/junit/junit/4.12/2973d150c0dc1fefe998f834810d68f278ea58ec/junit-4.12.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/2.6.0/b532c3fc4f66bcfee4989a3514f1cd56203a33ad/assertj-core-2.6.0.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/1.10.19/e8546f5bef4e061d8dd73895b4e8f40e3fe6effe/mockito-core-1.10.19.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.3/42a25dc3219429f0e5d060061f71acb49bf010a0/hamcrest-core-1.3.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-library/1.3/4785a3c21320980282f9f33d0d1264a69040538f/hamcrest-library-1.3.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.skyscreamer/jsonassert/1.4.0/9cdbb373a06f6513e51e8c545ee6a5e981463edb/jsonassert-1.4.0.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/4.3.10.RELEASE/db1462df62dbedad7244da30ec471390660271c0/spring-core-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/4.3.10.RELEASE/e82664ba39497626cd29298cb16c161d901bfbee/spring-test-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/1.5.6.RELEASE/a6e13da038c6eb8b8793795b3189d5ff3f39caa0/spring-boot-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/1.5.6.RELEASE/436d14480a4ebeaca7cd223ab97790d515f46ad2/spring-boot-autoconfigure-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/1.5.6.RELEASE/74a50fb623c47d76c71402d8c6cc4ac4ba71d39e/spring-boot-starter-logging-1.5.6.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.17/7a27ea250c5130b2922b86dea63cbb1cc10a660c/snakeyaml-1.17.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-core/8.5.16/1318c2a44de53b692cb42021dc3d9a2a185e65a4/tomcat-embed-core-8.5.16.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-el/8.5.16/d8d33b26d42c3857c6d2a566dd842d2308582020/tomcat-embed-el-8.5.16.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-websocket/8.5.16/8df572a6fa38c24a6366ab254b9bde496ed5ea95/tomcat-embed-websocket-8.5.16.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/javax.validation/validation-api/1.1.0.Final/8613ae82954779d518631e05daa73a6a954817d5/validation-api-1.1.0.Final.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.3.1.Final/c46217ab74b532568c0ed31dc599db3048bd1b67/jboss-logging-3.3.1.Final.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.fasterxml/classmate/1.3.3/864c8e370a691e343210cc7c532fc198cee460d8/classmate-1.3.3.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.8.0/45b426f7796b741035581a176744d91090e2e6fb/jackson-annotations-2.8.0.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.8.9/569b1752705da98f49aabe2911cc956ff7d8ed9d/jackson-core-2.8.9.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/4.3.10.RELEASE/3a8c23246045e5e1dbd7d91354741b165e997a88/spring-aop-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.3.10.RELEASE/9d89b786f755f9b1da344f10f6f045f927679a72/spring-beans-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/4.3.10.RELEASE/645ce6fdba38448d183a1374506fc24036009869/spring-context-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/4.3.10.RELEASE/4975ab542028945ab98fefba772472a40495d7ca/spring-expression-4.3.10.RELEASE.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/net.minidev/json-smart/2.2.1/5b9e5df7a62d1279b70dc882b041d249c4f0b002/json-smart-2.2.1.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.25/da76ca59f6a57ee3102f8f9bd9cee742973efa8a/slf4j-api-1.7.25.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/2.1/87c0ea803b69252868d09308b4618f766f135a96/objenesis-2.1.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/com.vaadin.external.google/android-json/0.0.20131108.vaadin1/fa26d351fe62a6a17f5cda1287c1c6110dec413f/android-json-0.0.20131108.vaadin1.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.1.11/ccedfbacef4a6515d2983e3f89ed753d5d4fb665/logback-classic-1.1.11.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.slf4j/jcl-over-slf4j/1.7.25/f8c32b13ff142a513eeb5b6330b1588dcb2c0461/jcl-over-slf4j-1.7.25.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.25/af5364cd6679bfffb114f0dec8a157aaa283b76/jul-to-slf4j-1.7.25.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.slf4j/log4j-over-slf4j/1.7.25/a87bb47468f47ee7aabbd54f93e133d4215769c3/log4j-over-slf4j-1.7.25.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/1.1/a527213f2fea112a04c9bdf0ec0264e34104cd08/accessors-smart-1.1.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.1.11/88b8df40340eed549fb07e2613879bf6b006704d/logback-core-1.1.11.jar
/home/kdvolder/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/5.0.3/dcc2193db20e19e1feca8b1240dbbc4e190824fa/asm-5.0.3.jar

Observations about the classpath... It has some problems:

1) It contains test dependencies. This is a known issue with gradle tooling, though supposedly it was fixed already. See: https://github.com/eclipse/buildship/issues/354 I don't think this is the problem here. But it is a problem nonetheless and will cause some apps to not run correctly (spring boot autoconfig has a knack for scannning classpath and picking up on the extra stuff and start configuring and using it).

2) while bin folder is on the classpath. It does not contain application.properties (which we should expect to be there if project was properly compiled).

Number 2) is the important point here. Trying now to determine why application.properties isn't there.

kdvolder commented 6 years ago

More problems (probable cause of the missing .properties file in bin folder):

Looking inside the .classpath file. (I assume it was added by redhat jdt language server which is really just Eclipse JDT under the hood). We see this:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" path="src/test/java"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

The problem here is that we are missing the src/main/resources source folder. This makes sense because we created the folder after jdt ls created the .classpath file. If I was using Eclipse proper then I would solve this by forcing BuildShip (or Maven) to update the project configuration. Eclipse has some menu commands for that.

In vscode, we can trigger the refresh indirectly by editing build.gradle. I added some whitespace and saved it. I was prompted by jdt to refresh the project config. I said 'yes, allways'.

The classpath file was updated to this:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" path="src/test/java"/>
    <classpathentry kind="src" path="src/main/resources"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

Note that it now contains src/main/resources as a source folder.

Also, looking in bin folder we now see that application.properties was copied there as it should.

We now launch the process again by pressing F5 and it seems to work properly.

kdvolder commented 6 years ago

The above is a little long. Here a short summary:

Some other important points (not directly related to the application.properties).

  1. This is a bit of an odd project. It contains both maven and gradle build files. The idea being that a user can choose which one they like. But there is no way in vscode Java tooling to make that choice. It looks like JDT ls decided to use gradle instead of maven. Personally I think if both are present it is probably better to choose maven (buildship is still a bit more buggy than m2e, so you will have fewer problems).

  2. Test dependencies were added to runtime classpath. This is also a problem. I am not sure who we should blame for this. It could be JDT LS because of the mentioned bug (https://github.com/eclipse/buildship/issues/354) or it could the way the debugger-launcher computes the classpath.

andxu commented 6 years ago

@kdvolder Thanks very much for your feedback, the project support is been under consideration after the next feature conditional breakpoint completes, the way from different project type to generate .classpath and .project is not transparent to user and user can hardly do anything.

andxu commented 6 years ago

@kdvolder @amitmerin This issue is solved at java language server side, see discussions at https://github.com/redhat-developer/vscode-java/issues/400