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

Debugger ignores spring boot application.properties #157

Closed
amitmerin opened this issue Nov 15, 2017 · 8 comments
Closed

Debugger ignores spring boot application.properties #157

amitmerin opened this issue Nov 15, 2017 · 8 comments
Assignees

Comments

@amitmerin
Copy link

amitmerin commented Nov 15, 2017

Using the basic spring boot example app from https:/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 amitmerin changed the title Debugger ignores spring-boot application.properties Debugger ignores spring boot application.properties Nov 15, 2017
@amitmerin
Copy link
Author

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
Copy link
Member

akaroml commented Mar 2, 2018

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

@Matthew-Dong
Copy link

Greetings,

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

spring-projects/sts4#43

@kdvolder
Copy link

kdvolder commented Mar 6, 2018

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:/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:

  • a folder called bin was automatically created. It contains compiled java classes.
  • the bin folder does not contain application.properties file.
  • I used jconsole to connect the launched process and get its classpath. It looks like this:
/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: Remove test dependencies from runtime classpath eclipse/buildship#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
Copy link

kdvolder commented Mar 6, 2018

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
Copy link

kdvolder commented Mar 6, 2018

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

  • the generated .classpath is missing src/main/resources as a source folder.
  • this is because the folder did not yet exist when .classpath was generated.
  • this is the reason why application.properties was missing from the runtime classpath.

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 (Remove test dependencies from runtime classpath eclipse/buildship#354) or it could the way the debugger-launcher computes the classpath.

@andxu
Copy link
Contributor

andxu commented Mar 7, 2018

@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
Copy link
Contributor

andxu commented Apr 24, 2018

@kdvolder @amitmerin This issue is solved at java language server side, see discussions at
redhat-developer/vscode-java#400

@andxu andxu closed this as completed Apr 24, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants