私はSpring Bootとjson-schema-validator
を使用しています。 resources
フォルダーからjsonschema.json
というファイルを読み取ろうとしています。いくつかの異なる方法を試してみましたが、動作させることができません。これは私のコードです。
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
これはファイルの場所です。
そして、ここでclasses
フォルダー内のファイルを見ることができます。
しかし、コードを実行すると、次のエラーが発生します。
jsonSchemaValidator error: Java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)
私のコードで間違っているのは何ですか?
この問題を解決するために多くの時間を費やした後、最終的に機能する解決策を見つけました。このソリューションは、SpringのResourceUtilsを利用しています。 JSONファイルでも機能するはずです。
Lokesh Guptaによるよく書かれたページをありがとう: Blog
package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Properties;
import Java.io.File;
public class Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());
public static Properties fetchProperties(){
Properties properties = new Properties();
try {
File file = ResourceUtils.getFile("classpath:application.properties");
InputStream in = new FileInputStream(file);
properties.load(in);
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
return properties;
}
}
コメントに関するいくつかの懸念に答えるには:
Java -jar target/image-service-slave-1.0-SNAPSHOT.jarを使用してAmazon EC2でこれを実行していることを確認してください。私のgithubリポジトリを見てください: https://github.com/ johnsanthosh/image-service を使用して、JARからこれを実行する正しい方法を見つけます。
非常に短い答え:ターゲットクラスではなく、特定のクラスローダーのスコープでプロパティを探しています。これは動作するはずです:
File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
また、これを参照してください:
追伸プロジェクトが1台のマシンでコンパイルされ、その後別のマシンで起動された場合、またはDockerでアプリを実行した場合に問題が発生する可能性があります。この場合、リソースフォルダーへのパスが無効になる可能性があります。この場合、実行時にリソースへのパスを決定することをお勧めします。
ClassPathResource res = new ClassPathResource("jsonschema.json");
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);
たとえば、Resourcesフォルダの下にconfigフォルダがある場合、このクラスが完全に機能することを試みました
File file = ResourceUtils.getFile("classpath:config/sample.txt")
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
これが私の解決策です。誰かを助けるかもしれません。
InputStreamを返しますが、あなたもそれを読むことができると思います。
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");
同じ問題で立ち往生しているこれは私を助けます
URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);
ここで私の答えを参照してください: https://stackoverflow.com/a/56854431/4453282
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
これらの2つのインポートを使用します。
宣言する
@Autowired
ResourceLoader resourceLoader;
これを何らかの機能で使用する
Resource resource=resourceLoader.getResource("classpath:preferences.json");
あなたの場合、あなたがファイルを必要とするとき、あなたは以下を使うかもしれません
File file = resource.getFile()
参照: http://frugalisminds.com/spring/load-file-classpath-spring-boot/ 前の回答ですでに述べたように、ResourceUtilsを使用しないでください。JARのデプロイ後は機能しません。これはIDEで動作するだけでなく、展開後も動作します