如何读取可执行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 文件时,它无法将文件加载到 reader。我读过我需要使用:
FindClassName.class.getResource("FindClassName.java");
但这给了我 NullPointerException。我尝试了许多不同的方法,但仍然无法使用 getResource() 或 getResourcesAsStream() 将 .java 文件加载到 reader。
我知道有很多这样的问题,但我找不到解决方案。
编辑
这很奇怪,这段代码现在可以在可执行 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>
见this link for more information or this video using 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: include source code while exporting as runnable 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 文件时,它无法将文件加载到 reader。我读过我需要使用:
FindClassName.class.getResource("FindClassName.java");
但这给了我 NullPointerException。我尝试了许多不同的方法,但仍然无法使用 getResource() 或 getResourcesAsStream() 将 .java 文件加载到 reader。
我知道有很多这样的问题,但我找不到解决方案。
编辑
这很奇怪,这段代码现在可以在可执行 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>
见this link for more information or this video using 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: include source code while exporting as runnable jar