Читай из весеннего бута - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующая структура jar для весенней загрузки

- bootstrap.yml
- org
- META-INF
  -- MANIFEST.MF
  -- Maven
     -- org.account.core
      -- account-service
       -- pom.properties
       -- pom.xml

Теперь я хочу прочитать мой pom-файл из класса Util в том же банке.Приведенный ниже код всегда возвращает пустое значение.

public static String findFilePathInsideJar(String matchingFile) throws IOException {
        String path = null;
        File jarFile = new File(FileUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath());
        if (jarFile.isFile()) {
            JarFile jar = new JarFile(jarFile);
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                String name = entries.nextElement().getName();
                if (name.endsWith(matchingFile)) {
                    path = name;
                    break;
                }
            }
            jar.close();
        }
        return path;
 }

, и я вызываю утилиту следующим образом:

String path = findFilePathInsideJar("pom.xml");

путь всегда равен нулю.

1 Ответ

0 голосов
/ 17 октября 2018

Path всегда равно нулю, потому что jarFile.isFile() == false:)

Также Path бесполезно, потому что вы не можете прочитать его позже вне JarFile, вот пример того, как читать pom.xml из текущегоПружинный ботинок uber баночка:

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) throws IOException {
        SpringApplication.run(DemoApplication.class, args);

        String currentJarPath = deduceCurrentJarPath();
        Optional<InputStream> pom = findFileInJar(currentJarPath, "pom.xml");

        // read pom.xml and print in console
        if (pom.isPresent()) {
            InputStream inputStream = pom.get();
            byte[] pomBytes = new byte[1024 * 1024];
            inputStream.read(pomBytes);
            inputStream.close();
            System.out.println(new String(pomBytes));
        }

    }

    private static String deduceCurrentJarPath() {
        String path = DemoApplication.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        int endPathIndex = path.indexOf(".jar") + ".jar".length();
        int startPathIndex = "file:".length();
        return path.substring(startPathIndex, endPathIndex);
    }

    public static Optional<InputStream> findFileInJar(String jarPath, String fileName) {
        try (JarFile jarFile = new JarFile(new File(jarPath))) {
            Enumeration<JarEntry> jarEntries = jarFile.entries();
            while (jarEntries.hasMoreElements()) {
                JarEntry jarEntry = jarEntries.nextElement();
                String name = jarEntry.getName();
                if (name.endsWith(fileName)) {
                    InputStream inputStream = jarFile.getInputStream(jarEntry);
                    byte[] bytes = new byte[inputStream.available()];
                    inputStream.read(bytes);
                    return Optional.of(new ByteArrayInputStream(bytes));
                }
            }
            return Optional.empty();
        } catch (IOException e) {
            e.printStackTrace();
            return Optional.empty();
        }
    }

}
...