java-spring与flyway加载jar包内文件示例

文件加载

操作磁盘文件 java.io.File
操作jar包内文件 java.util.jar.JarFile
扫描classpath下文件(含jar包内文件) Enumeration urlEnumerations = classLoader.getResources(path);

flyway示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.sysware;

import org.flywaydb.core.internal.util.scanner.Resource;
import org.flywaydb.core.internal.util.scanner.classpath.ClassPathLocationScanner;
import org.flywaydb.core.internal.util.scanner.classpath.ClassPathResource;
import org.flywaydb.core.internal.util.scanner.classpath.FileSystemClassPathLocationScanner;
import org.flywaydb.core.internal.util.scanner.classpath.JarFileClassPathLocationScanner;
import org.junit.Test;

import java.net.URL;
import java.util.Enumeration;
import java.util.Set;
import java.util.TreeSet;

public class FlywayFileScannerTest {

@Test
public void jarScanner() throws Exception {
String path = "customize/sql";//classpath:
ClassLoader classLoader = getClass().getClassLoader();
Set<Resource> resources = new TreeSet<>();

Enumeration<URL> urlEnumerations = classLoader.getResources(path);
while (urlEnumerations.hasMoreElements()) {
URL url = urlEnumerations.nextElement();

// jar/file
String protocol = url.getProtocol();
ClassPathLocationScanner locationScanner = null;
//文件的话直接读
if ("file".equalsIgnoreCase(protocol)) {
locationScanner = new FileSystemClassPathLocationScanner();
} else if ("jar".equalsIgnoreCase(protocol)) {
locationScanner = new JarFileClassPathLocationScanner();
}
if (locationScanner == null) {
System.err.println(url.getFile());
continue;
}

Set<String> resourceNames = locationScanner.findResourceNames(path, url);
for (String resourceName : resourceNames) {
if (resourceName == null || !resourceName.endsWith("sql")) continue;
resources.add(new ClassPathResource(resourceName, classLoader));
}
}

System.out.println(resources);
for (Resource resource : resources) {
System.out.println(resource.getFilename());
System.out.println(resource.loadAsString("UTF-8"));
}
}

}

spring示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.sysware;

import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public class SpringFileScannerTest {

@Test
public void jarScanner() throws Exception {
PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("classpath*:customize/sql/*.sql");
for (Resource resource : resources) {
System.out.println(resource.getFilename());
System.out.println(IOUtils.toString(resource.getInputStream()));
}
}
}