javacoder
javacoder

Reputation: 21

Access environment variable in .conf file for spring boot app

I have set environment variable by executing the command

export test=abcd

I can see test=abcd when I run printenvcommand

I have deployed a springboot.jar application and I am passing the JAVA_OPTS from the springboot.conf file.

JAVA_OPTS='-Dspring.profiles.active=aaa -Denv=$test'

I started the app by service springboot start . When I check the process, env variable doesn't have the value of $test environment variable.

/usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Dspring.profiles.active=aaa -Denv=.

How can I access the environment variable in the conf file? I read somewhere the environment variables will be stripped off when run as service. Basically I want to run as service springboot start which internally executes the below command

java -Dspring.profiles.active=aws -Denv=${whatever is set for env environment variable} -jar springboot.jar

I have tried the below configurations but nothing worked

JAVA_OPTS='-Dspring.profiles.active=aaa -Denv='$test
JAVA_OPTS='-Dspring.profiles.active=aaa -Denv='${test}
JAVA_OPTS='-Dspring.profiles.active=aaa -Denv=${test}'
JAVA_OPTS="-Dspring.profiles.active=aaa -Denv=$test"

Upvotes: 2

Views: 2945

Answers (2)

Abba
Abba

Reputation: 51

I had the same problem where my .conf was referencing an environment variable which was in the .bashrc.

What I found out is: The problem is service strips all environment variables but TERM, PATH and LANG which is a good thing. If you are executing the script directly nothing removes the environment variables so everything works.

https://unix.stackexchange.com/questions/44370/how-to-make-unix-service-see-environment-variables

One solution would be to install your app as a systemd service:

https://docs.spring.io/spring-boot/docs/1.3.x-SNAPSHOT/reference/html/deployment-install.html

Or another way is to use docker and you can specify extra configuration in the docker file, like loading a file which contains your environment variables.

As those solutions where not available in my case I ended up with having the value in the .conf file, like: -Denv=prod

Upvotes: 0

gogstad
gogstad

Reputation: 3739

Be careful about your quotes. Assuming that you use a "normal" shell, variables won't be substituted in single quotes.

java -Dspring.profiles.active=aws -Denv="$myvariable" -jar springboot.jar should lead to env being available in the JVM, no matter if you run it as a service or not.

If you can't get it to work, try to specify a hard coded value like this java -Dspring.profiles.active=aws -Denv=foo -jar springboot.jar. If env is now available in the JVM, your problem is with your shell or run mechanism. Verify that the user who runs the command (i.e. do you use sudo?) has the variable set.

Upvotes: 1

Related Questions