1

Maven プロファイルと JAR ビルドを使用する Java アプリケーションを作成しています。

このフォルダーにいくつかの XML ファイルがあります: project/src/main/resources/XML/*.xml

src/main/resources フォルダーはビルド パスのソース フォルダーであるため、JAR バイナリで project.jar/XML/*.xml をビルドします。

JAR 実行でこれらのファイル "/XML/*.xml" を検索して一覧表示できるようにしたいと考えています。私の構造はこれに適していますか?

Maven プロファイルでの実行に問題はありませんが、これらのファイルを見つけて一覧表示する良い方法が見つかりません。

4

3 に答える 3

2

本当に良い方法はありません。依存関係を気にしないのであれば、JARとディレクトリの違いを抽象化spring-coreする優れた機能があります。PathMatchingResourcePatternResolver

PathMatchingResourcePatternResolver resolver =
   new PathMatchingResourcePatternResolver(MyClass.class.getClassLoader());
Resource[] xmls = resolver.getResources("classpath*:XML/*.xml");
于 2012-12-11T22:52:36.180 に答える
0

jar ファイルの内容を一覧表示する場合は、次のコマンドを実行するだけです。

jar tf ./path/to/your/file.jar

また

jar tf ./path/to/your/file.jar | grep XML

コードから(これが唯一の方法ではないと思います)Main、jar内にあるクラスに置き換える必要があります:

              List<String> myJarXmlFiles = new ArrayList<String>();
    try {
                       // replace Main here   
        CodeSource src = Main.class.getProtectionDomain().getCodeSource();
        if (src != null) {
            URL jar = src.getLocation();
            ZipInputStream zip = new ZipInputStream(jar.openStream());
            ZipEntry entry = null;
            while ((entry = zip.getNextEntry()) != null) {
                if (entry.getName().contains("XML/")
                        && entry.getName().endsWith(".xml")) {
                    myJarXmlFiles.add(entry.getName());
                }
            }
        } else {
            // failed
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
于 2012-12-11T08:54:43.583 に答える
0

このコードは、アプリのクラスパスで jar のパスを見つけて、フォルダーの内容を一覧表示する方法を示しています。

// you need to get of a URL of any class in your jar
URL url = Appender.class.getProtectionDomain().getCodeSource()
           .getLocation();
File file = new File(url.getFile());
System.out.println(file.getCanonicalPath());
JarFile jar = new JarFile(file);
Enumeration<JarEntry> i = jar.entries();
while (i.hasMoreElements()) {
    JarEntry e = i.nextElement();
    if (e.getName().startsWith("META-INF/")) {
        System.out.println(e.getName());
    }
}
jar.close();

出力

jar:file:/C:/temp/.repository/log4j/log4j/1.2.17/log4j-1.2.17.jar!/org/apache/log4j/Appender.class
C:\temp\.repository\log4j\log4j\1.2.17\log4j-1.2.17.jar
META-INF/MANIFEST.MF
META-INF/
META-INF/LICENSE
META-INF/NOTICE
META-INF/maven/
META-INF/maven/log4j/
META-INF/maven/log4j/log4j/
META-INF/maven/log4j/log4j/pom.properties
META-INF/maven/log4j/log4j/pom.xml
于 2012-12-11T10:14:01.217 に答える