【发布时间】:2020-01-18 18:08:09
【问题描述】:
注意事项
请参阅下面问题的编辑部分,因为进一步调查已使该问题的大部分内容变得多余。
类似于this question,在使用 VSCode 时,我似乎无法在启动时将环境变量传递给我的应用程序。问题是,我不知道是什么(或是否有)扩展导致了问题。
我有带有以下扩展的 VSCode 1.38.1;
- Java 0.48.0 的语言支持
- Java 扩展包 0.8.0
- Maven for Java 0.18.2
- Spring Boot 仪表板 0.1.6
- Spring Boot 工具 1.10.0
- 还有其他几个我认为不是罪魁祸首的人。
我想做的是使用 maven 配置文件有条件地引入依赖项,并使用环境变量来触发它。在我的 pom.xml 中,我有;
<profiles>
<profile>
<id>dev-mysql</id>
<activation>
<!-- activate if system properties 'env=dev-mysql' passed in on launch.json env property from VSCode -->
<!-- Following does not work :( -->
<property>
<name>env</name>
<value>dev-mysql</value>
</property>
<!-- Obtain the following info by running - mvn enforcer:display-info -->
<!-- <os>
<name>windows 7</name>
<family>windows</family>
<arch>amd64</arch>
<version>6.1</version>
</os> -->
</activation>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
</dependencies>
</profile>
</profiles>
我尝试通过类似的方式在 launch.json 中设置 env 值;
{
"type": "java",
"name": "Debug (Launch)-MyServiceApplication<my-service>",
"request": "launch",
"mainClass": "myapp.MyServiceApplication",
"projectName": "my-service",
"vmArgs": "-Dspring.profiles.active=local-mysql",
"env": {
"env": "dev-mysql"
}
}
我还尝试通过 settings.json 添加 maven customEnv,因为 Maven for Java 扩展似乎暗示“...这些环境变量值将被添加到终端会话 before Maven首先执行”。我的 settings.json 文件看起来像;
{
"java.configuration.updateBuildConfiguration": "automatic",
"files.exclude": {
"**/.classpath": true,
"**/.project": true,
"**/.settings": true,
"**/.factorypath": true
},
"maven.terminal.customEnv": [
{
"environmentVariable": "env",
"value": "dev-mysql"
}
]
}
我通过按 F5 来执行我的应用程序,据我了解,它执行上面 launch.json sn-p 中显示的内容。我不太明白这里是如何调用 maven 的。但是,无论如何,它似乎永远找不到环境变量,因此包含配置文件特定的 mysql 依赖项。即使我使用 Spring Boot Dashboard,我也会得到相同的结果;无法识别 mysql 依赖项,所以我最终得到 Cannot load driver class: com.mysql.cj.jdbc.Driver
如果我注释掉 pom.xml 的 <property> 元素并取消注释 <os> 元素,那么它确实引入了配置文件特定的 mysql 依赖项。所以我猜它正确使用了pom文件。
有没有人知道如何设置环境变量以便通过此配置识别它们?此外,有关当我使用此设置(是 maven 还是 Java)点击 F5 时实际执行的内容的任何进一步信息,将不胜感激。
编辑:
一些进一步的调查表明我是"...confusing Environment Variables with System Properties"Wouter Lievens 的评论。
This post 还建议“您不能根据构建计划开始执行后定义的系统属性激活配置文件”,这很可能是我刚刚按 F5 执行我的应用程序时发生的情况。这还链接到 this answer 中的一些进一步信息,其中阐明了 if 不起作用,因为“......配置文件是在确定有效 POM 之前评估的第一件事。”。
我的解决方法是不使用 F5,而是设置 spring-profiles-active=local-mysql 后,我必须使用 Maven for Java Explorer 来执行 spring-boot:run -Pdev-mysql 的自定义目标
所以我的最后一个问题是;
考虑到我添加到 VSCode 的扩展以及上面的 launch.json,当我使用这个设置点击 F5 时实际执行的是什么 - 是 Maven、Java 还是其他什么?如果是 Java,pom.xml 是如何发挥作用的?如果是Java,有没有办法调整launch.json改用mvn?
当我按下 F5 以更好地了解实际执行的内容时,有没有办法提高日志记录的详细程度?
【问题讨论】:
-
你的意思是你不能得到你在
launch.json中设置的env值吗? -
是的@LeoZhu-MSFT,这是正确的。我的理解是 pom.xml 中的配置文件应该选择“属性”部分下指定的环境变量。如果将其设置为 dev-mysql,则该 spring 配置文件下的依赖项应该被拉入。
-
是否需要通过 Maven 在 SpringBoot 中配置活动配置文件?我不太了解。this 有帮助吗?
-
@LeoZhu-MSFT,感谢您的建议。它可能会提供一些激活配置文件的替代方法,但并不是我所追求的。我不得不编辑我的问题,因为进一步调查意味着我对事物的理解不正确,因此对行为的期望不切实际。我仍然发现所有的扩展都会添加到 VSCode 中,但有时我对如何协同工作以运行应用程序感到有些困惑,因此将其作为这个问题的重点。
标签: java maven spring-boot visual-studio-code