簡體   English   中英

何在可執行jar中讀取.java文件

[英]Ho to read .java file in executable jar

我正在使用此代碼加載.java文件並執行搜索:

public class FindClassName {

    public static void main(String[] args) {
        Logger logger = Logger.getLogger("MOJ.Logger");

        try(Scanner scanner = new Scanner(new FileReader("./src/string/FindClassName.java"))){
            String pattern = "class\\s*(\\w+)\\s*";
            List<String> list = new LinkedList<>();
            while(scanner.hasNext()){
                String line = scanner.nextLine();
                Matcher matcher = Pattern.compile(pattern).matcher(line);
                while(matcher.find()){
                    list.add(matcher.group(1));
                }
            }
            System.out.println(list);
        }catch(IOException exception){
            logger.info("Couldn't read file");
        }
    }


    static class CHUJ{

    }

}

它的工作原理,但當我將其導出到可執行的.jar文件時,它無法將文件加載到閱讀器。 我讀過我需要使用:

FindClassName.class.getResource("FindClassName.java");

但是這給了我NullPointerException。 我嘗試了許多不同的方法,但仍然無法使用getResource()或getResourcesAsStream()將.java文件加載到閱讀器。

我知道有很多類似的問題,但我找不到解決方案。

編輯

這很奇怪,這段代碼現在運行在可執行jar(包含資源)但不在eclipse中......為什么? 有沒有更好的辦法?

public class FindClassName {

    public static void main(String[] args) throws FileNotFoundException {
        Logger logger = Logger.getLogger("MOJ.Logger");

        //String directory = "./src/string/FindClassName.java"; //to będzie działać w eclipsie, ale jak zrobisz z tego jar to wszystkie pliki .java zostaną skompilowane na .class
        InputStream directory = FindClassName.class.getResourceAsStream("FindClassName.java");

        try(Scanner scanner = new Scanner(new InputStreamReader(directory))){
            String pattern = "class\\s*(\\w+)\\s*";
            List<String> list = new LinkedList<>();
            while(scanner.hasNext()){
                String line = scanner.nextLine();
                Matcher matcher = Pattern.compile(pattern).matcher(line);
                while(matcher.find()){
                    list.add(matcher.group(1));
                }
            }
            System.out.println(list);
        }
    }


    static class CHUJ{

    }

}

問題:

當您創建一個可執行的JAR(實際上是任何jar)時,所有.java文件都會被編譯並轉換為.class文件,然后由JVM使用。

解:

一種解決方案是將源代碼目錄包含為附加資源目錄(不是正常的用例):

<build>
    <resources>
        <resource>
            <directory>${project.build.sourceDirectory}</directory>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

有關使用Eclipse的更多信息或此視頻,請參閱此鏈接

這樣的事情應該這樣做:

C:\>java -jar JarFileExample.jar
package com.mycompany.myproject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class JarFileExample {

        public static void main(String[] args) throws Exception {
                InputStream is = JarFileExample.class.getResourceAsStream("/com/mycompany/myproject/JarFileExample.java");
                writeFileToConsole(is);
        }

        private static void writeFileToConsole(InputStream is) throws IOException {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                for(String str = reader.readLine(); str != null; str = reader.readLine()) {
                        System.out.println(str);
                }
                reader.close();
        }

}

C:\>

源代碼可以很容易地包含在jar文件中,但取決於您用來創建jar的工具。 我使用了eclipse,基本上是這里描述的方法: Eclipse:在導出為runnable jar時包含源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM