環境:
MacBook Pro 13
jdk8
IntelliJ IDEA 2018.3.3
1. 問題描述
項目依賴Apollo配置,本地可以配置
config-cache
加載配置。
最近項目config 突然加載異常, 顯示某個屬性must not be empty
部分異常信息。
2. 問題分析
- 最近發現
- 項目剛起動就跑異常
針對1
,2
兩點分析。
驗證1
, 加載unitTest 嘗試是否能加載本地config-cache
;
結果發現,加載失敗,並從報錯信息找到root cause
。
2020-02-25 18:41:44,216 ERROR Application startup resulted in exception
com.google.inject.CreationException: Unable to create injector, see the following errors:
1) Error in custom provider, java.lang.IllegalArgumentException: resourceName must not be empty
while locating com.leyantech.inspector.conf.db.DruidDataSourceProvider
at org.mybatis.guice.MyBatisModule.bindDataSourceProviderType(MyBatisModule.java:289) (via modules: com.leyantech.inspector.conf.di.InspectorGuiceModule -> com.google.inject.util.Modules$OverrideModule -> com.leyantech.inspector.conf.di.DefaultMybatisModule)
while locating javax.sql.DataSource
for field at org.mybatis.guice.environment.EnvironmentProvider.dataSource(EnvironmentProvider.java:52)
at org.mybatis.guice.environment.EnvironmentProvider.class(EnvironmentProvider.java:27)
while locating org.mybatis.guice.environment.EnvironmentProvider
at org.mybatis.guice.MyBatisModule.internalConfigure(MyBatisModule.java:110) (via modules: com.leyantech.inspector.conf.di.InspectorGuiceModule -> com.google.inject.util.Modules$OverrideModule -> com.leyantech.inspector.conf.di.DefaultMybatisModule$1)
while locating org.apache.ibatis.mapping.Environment
for the 1st parameter of org.mybatis.guice.configuration.ConfigurationProvider.<init>(ConfigurationProvider.java:109)
at org.mybatis.guice.configuration.ConfigurationProvider.class(ConfigurationProvider.java:39)
while locating org.mybatis.guice.configuration.ConfigurationProvider
at org.mybatis.guice.MyBatisModule.internalConfigure(MyBatisModule.java:113) (via modules: com.leyantech.inspector.conf.di.InspectorGuiceModule -> com.google.inject.util.Modules$OverrideModule -> com.leyantech.inspector.conf.di.DefaultMybatisModule$1)
while locating org.apache.ibatis.session.Configuration
for the 1st parameter of org.mybatis.guice.session.SqlSessionFactoryProvider.createNewSqlSessionFactory(SqlSessionFactoryProvider.java:59)
at org.mybatis.guice.session.SqlSessionFactoryProvider.class(SqlSessionFactoryProvider.java:26)
while locating org.mybatis.guice.session.SqlSessionFactoryProvider
while locating org.apache.ibatis.session.SqlSessionFactory
for the 1st parameter of org.mybatis.guice.session.SqlSessionManagerProvider.createNewSqlSessionManager(SqlSessionManagerProvider.java:49)
at org.mybatis.guice.session.SqlSessionManagerProvider.class(SqlSessionManagerProvider.java:24)
while locating org.mybatis.guice.session.SqlSessionManagerProvider
at org.mybatis.guice.AbstractMyBatisModule.configure(AbstractMyBatisModule.java:59) (via modules: com.leyantech.inspector.conf.di.InspectorGuiceModule -> com.google.inject.util.Modules$OverrideModule -> com.leyantech.inspector.conf.di.DefaultMybatisModule$1)
while locating org.apache.ibatis.session.SqlSessionManager
for field at org.mybatis.guice.mappers.MapperProvider.sqlSessionManager(MapperProvider.java:37)
while locating org.mybatis.guice.mappers.MapperProvider
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies.initialize(Providers.java:149)
at org.mybatis.guice.AbstractMyBatisModule.bindMapper(AbstractMyBatisModule.java:96) (via modules: com.leyantech.inspector.conf.di.InspectorGuiceModule -> com.google.inject.util.Modules$OverrideModule -> com.leyantech.inspector.conf.di.DefaultMybatisModule)
Caused by: java.lang.IllegalArgumentException: resourceName must not be empty
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:141)
1
打開vivo
項目增加 測試code
public class LocalApolloTest {
static {
System.setProperty("app.id", "430");
}
public static void main(String[] args) {
Config config = ConfigService.getAppConfig();
System.out.println(
config.getProperty("inspector.jdbc.driverName", "failed")); // default value is "failed"
}
}
output:
2020-02-25 20:39:41,707 WARN Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.LocalFileConfigRepository, reason: Load config from local config failed! [Cause: Cannot read from local cache file /Users/**/workspace/gitlab/oppo/config-cache/430+default+application.properties]
2020-02-25 20:39:41,712 WARN Init Apollo Local Config failed - namespace: application, reason: Load config from local config failed! [Cause: Cannot read from local cache file /Users/**/workspace/gitlab/oppo/config-cache/430+default+application.properties].
2020-02-25 20:39:41,716 WARN Could not load config for namespace application from Apollo, please check whether the configs are released in Apollo! Return default value now!
`failed`
和 local config相去甚遠.
同時console 中輸出重要信息:
/Users/**/workspace/gitlab/oppo/config-cache/430+default+application.properties].
這裏配置爲啥會從 oppo
項目加載呢?
解決辦法:
看一下IDEA 目錄結構:
由於這個IDEA 第一個打開的是oppo
項目,導致其他以import module 進入的項目,加載config 時目錄都變成 /**/oppo/**.properties
.
即只需要重新open 需要項目的IDEA即可。
。。。