Spring 启动批处理 MultiResourceItemReader:如何使用 @Value() 从 jar 位置读取文件

Spring boot batch MultiResourceItemReader: how to read files using @Value() from jar location

我正在尝试使用@Value 注释获取输入文件,并将其设置为 MultiResourceItemReader 的资源数组,如下所示;

@Value("classpath*:/input/userdata*.csv")
private Resource[] inputFiles;

当我将输入文件夹放在资源文件夹中时,它在 IDE 中工作正常。问题是当我 运行 jar 文件时。如果文件在 IDE 中的 jar 中,它也可以正常工作。但是当我将输入文件夹放在 jar 文件的同一目录中时,它并没有启动。这是我的配置;

        @Value("classpath*:/input/userdata*.csv")
        private Resource[] inputFiles;
        
        @Bean
        public MultiResourceItemReader<UserInfo> multiResourceItemreader() {
            MultiResourceItemReader<UserInfo> reader = new MultiResourceItemReader<>();
            reader.setDelegate(userDataItemReader());
            reader.setResources(inputFiles);
            return reader;
        }

它没有给出任何错误,只是控制台中出现以下消息

2021-02-04 16:31:42.959  WARN 15772 --- [           main] o.s.b.item.file.MultiResourceItemReader  : No resources to read. Set strict=true if this should be an error condition.

我不确定我在这里遗漏了什么。尝试在@Value 中没有类路径前缀,但它给了我下面的异常

java.lang.IllegalArgumentException: Could not resolve resource location pattern [/input/userdata*.csv]

不确定除了 @Value 注释之外是否还有其他方法可以为 MultiResourceItemReader 设置资源。将不胜感激!

编辑:- 这是一个 Spring 启动批处理应用程序,这是目录结构

            apps
            ├── input
            │   ├── userdata6.csv
            │   ├── userdata7.csv
            │   ├── userdata8.csv
            │   └── userdata9.csv
            └── multisource-batch.jar

我运行来自同一个应用程序目录的如下jar文件

java -jar multisource-batch.jar

build.gradle

        plugins {
          id 'org.springframework.boot' version '2.4.2'
          id 'io.spring.dependency-management' version '1.0.11.RELEASE'
          id 'java'
        }

        group = 'com.thomsoncodes.batch'
        version = '0.0.1-SNAPSHOT'
        sourceCompatibility = '1.8'

        repositories {
            mavenCentral()
            maven { url 'https://repo.spring.io/milestone' }
        }

        ext {
            set('springCloudVersion', "2020.0.0")
        }

        dependencies {
            implementation 'org.springframework.boot:spring-boot-starter-batch'
            runtimeOnly 'mysql:mysql-connector-java'
            testImplementation 'org.springframework.boot:spring-boot-starter-test'
            testImplementation 'org.springframework.batch:spring-batch-test'
            
            implementation 'org.projectlombok:lombok:1.18.2'
        }

        dependencyManagement {
            imports {
                mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
            }
        }

        test {
            useJUnitPlatform()
        }

更新:- 最后我让它工作了!即使我删除了 Web 依赖项,spring 仍将其视为 Web。按照 Mahmoud Ben Hassine 的建议进行了干净的构建并更新了 @Value("file:/input/userdata*.csv")!

it is not picking up when I place the input folder in the same directory of jar

如果您是 运行 您的应用 java -jar myapp.jar,其中 input 目录与 myapp.jar 在同一目录中,那么您需要使用 file: 前缀而不是 classpath: 前缀。

@Value("file:input/userdata*.csv") 应该可以工作,因为它将从您启动 JVM 的相对目录中解析资源。

编辑: 你可以找到一个完整的例子 here