如何让 STS 4 识别 ~/.bash_profile 文件中定义的环境变量?

Posted

技术标签:

【中文标题】如何让 STS 4 识别 ~/.bash_profile 文件中定义的环境变量?【英文标题】:How do I get STS 4 to recognize environment variables defined in my ~/.bash_profile file? 【发布时间】:2020-10-11 14:52:39 【问题描述】:

我在 Mac OS X 上使用 STS 4.6.2.RELEASE 并尝试构建 Spring Boot 2 项目。我在 ~/.bash_profile 文件中定义了这些环境变量...

export PG_DB_NAME=cardmania
export PG_DB_USER=cardmania
export PG_DB_PASS=password
export PG_DB_HOST=localhost

然后在我的 src/main/resources/application.properties 文件中,我已经定义了

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.ddl-auto=create

spring.jpa.hibernate.show-sql=true

spring.datasource.url=jdbc:postgresql://$PG_DB_HOST:localhost:5432/$PG_DB_NAME

spring.datasource.username=$PG_DB_USER
spring.datasource.password=$PG_DB_PASS

但是,当我通过右键单击我的项目并选择“运行方式”->“Spring Boot 应用程序”从 STS 中启动我的 Spring Boot 应用程序时,我收到此错误...

org.postgresql.util.PSQLException: FATAL: role "$PG_DB_USER" does not exist
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2532) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2644) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:137) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:255) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:217) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.Driver.makeConnection(Driver.java:458) ~[postgresql-42.2.14.jar:42.2.14]
    at org.postgresql.Driver.connect(Driver.java:260) ~[postgresql-42.2.14.jar:42.2.14]
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na]
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na]
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

如果我在普通 shell 命令行上运行“java -jar target/cardmania-0.0.1-SNAPSHOT.jar”,则不会遇到此错误。

【问题讨论】:

这对您有帮助吗? ***.com/questions/56782840/… 也许我误读了您链接中的答案,但答案似乎建议将环境变量放在 ~/.bash_profile 文件中,这是我已经在做的。我应该尝试该解决方案的另一部分吗? 在那之后您是否重新启动了系统?重新启动后 mvn spring-boot:run 工作正常吗?通常,建立在 eclipse 之上的 eclipse 和 STS 应该占用 bash 文件中设置的环境变量,前提是它们的来源正确。要仔细检查并确保它们的来源,您能否检查 echo $PG_DB_USER 在重新启动后是否在终端中提供正确的输出? 另外,如果上述建议没有任何效果,您可以尝试将这些变量也添加到 /etc/environment 吗? 我确实重新启动了我的系统,确认我可以按照您的建议使用“echo $PG_DB_USER”查看 shell 上的环境变量,甚至尝试将导出添加到 /etc/enviornment 并重新启动,但 STS 仍然无法识别它们。当通过命令行正常运行时,应用程序确实可以正常启动。 【参考方案1】:

我相信这种行为更多地与您的 IDE 相关,而不是您的环境变量配置。我遇到了同样的问题并找到了解决方法,Eclipse STS 允许您为运行配置定义环境变量:

你也可以查看answer,也许它会给你其他方法

【讨论】:

“行为与你的 IDE 的关系比你的环境变量更多” 实际上,我认为这可能不是真的。我的猜测是 Mac OS 启动器明确地“清理”了 Eclipse(或您通过双击它启动的任何应用程序)看到的环境。最可能的原因是安全考虑(环境变量可能包含您不希望每个应用程序都看到的敏感数据)。因此,作为“一般安全措施”,Mac OS 仅将有限的环境传递给它从 UI 启动的进程。 您的回答仍然提供了一个很好的解决方法,因此对此表示赞同:-)。无论 STS 进程没有从 bash_profile 接收变量的原因是什么,始终可以使用 Eclipse 启动来按照您的建议显式提供它们。【参考方案2】:

如果您从 Finder、Dock 或 Spotlight 启动 STS,您应该编辑 ~/.MacOSX/environment.plist,而不是 ~/.bash_profile

另见:

Setting environment variables on OS X

如果您从命令行(bash)启动 STS,则不需要。

【讨论】:

关于 ~/.MacOSX/environment.plist,您链接到的内容是“请注意 environment.plist 不适用于通过 Spotlight 启动的应用程序。”但是,我尝试了他们建议的解决方案(将环境变量放在 /etc/launchd.conf 中),当我通过 STS 运行“运行方式”->“Maven 安装”时,从 Spotlight 或 finder 启动时无法识别我的环境变量。

以上是关于如何让 STS 4 识别 ~/.bash_profile 文件中定义的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在idea和STS之间保持代码风格和重新格式化一致?

无法识别 H2 数据库的语法问题

如何让 iTunes Connect 识别新的 Bundle ID

在 STS 4.6.1 中安装 Spring Roo 时出现问题

如何让mac虚拟机识别iphone

Spring Tools 4 STS New 菜单没有Spring Bean Configuration File选项