【開發環境】配置文件加載失敗,啓動報錯** must not be empty

環境:
MacBook Pro 13
jdk8
IntelliJ IDEA 2018.3.3

1. 問題描述

項目依賴Apollo配置,本地可以配置config-cache 加載配置。
最近項目config 突然加載異常, 顯示某個屬性must not be empty
部分異常信息。

2. 問題分析

  1. 最近發現
  2. 項目剛起動就跑異常

針對12 兩點分析。
驗證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即可。

。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章