ระบุไฟล์ในโฟลเดอร์ทรัพยากรในไฟล์ spring application.properties

ฉันมีแอปพลิเคชัน Spring Boot รหัสจำเป็นต้องเข้าถึงไฟล์ภายใต้โฟลเดอร์ทรัพยากร นี่คือไฟล์ application.properties ของฉัน:

cert.file=classpath:/resources/cert.p12

แต่ก็บ่นอยู่เสมอว่า

java.io.FileNotFoundException: classpath:/resources/cert.p12 (No such file or directory)

ฉันตรวจสอบโฟลเดอร์ my_project/target/classes อีกครั้งเพื่อให้แน่ใจว่าไฟล์ cert.p12 ออกจากที่นั่น

และในโค้ดฉันพยายามเข้าถึงไฟล์:

@Value("${cert.file}")
private String certFile;
....
@Bean
public Sender sender() {
    return new Sender(certFile);
}

classpath นี้คืออะไรกันแน่? แล้วทำไมมันหาไฟล์ไม่เจอล่ะ? ขอบคุณ!


person user468587    schedule 28.08.2015    source แหล่งที่มา
comment
คุณสามารถแก้ไขปัญหานี้ได้หรือไม่?   -  person David Krenkel    schedule 18.10.2017
comment
มีวิธีแก้ไขปัญหานี้ไหม?   -  person Vishal    schedule 25.04.2018


คำตอบ (5)


Classpath รวมถึงสิ่งที่คุณมี ภายใน ทรัพยากรของคุณ

พยายาม:

cert.file=classpath:cert.p12

ฉันสมมติว่าคุณมีโครงสร้างแค็ตตาล็อก maven มาตรฐาน

person raduy    schedule 29.08.2015
comment
มันมีข้อผิดพลาดเดียวกัน: FileNotFoundException: classpath:cert_key.p12.I ใช้โครงสร้าง maven มาตรฐาน - person user468587; 31.08.2015

ไวยากรณ์นี้ใช้ไม่ได้กับ FileInputStream ปกติ ใช้ Spring Resourceloader แทน

@Autowired
private ResourceLoader resourceLoader;

@Value("${property.name}")
private String property;

File getPropertyFile(){
    return resourceLoader.getResource(property).getFile();
}

application.properties

property.name=classpath:filename.txt
person Domo    schedule 11.12.2017
comment
เมื่อฉันรันแอปด้วย java -jar รหัสนี้ใช้ไม่ได้ - person amir110; 31.03.2020

คุณสามารถใช้ XXX.class.getResourceAsStream("filename") เพื่อรับทรัพยากรได้ เช่น:

ObjectInputStream ois = new ObjectInputStream(MyClass.class.getResourceAsStream(PUBLIC_KEY_FILE));
        Key key = (Key) ois.readObject();
        ois.close();

และนี่คืองานในโค้ดของฉัน MyClass เป็นแม่มดคลาสที่ใช้ไฟล์ crt ของคุณ PUBLIC_KEY_FILE ของฉันคือ "/rsa/PublicKey" และเพียงเก็บไว้ในโฟลเดอร์ src/main/resources/rsa

ที่ตั้งทรัพยากร

person BeeNoisy    schedule 09.11.2016

ดังที่ @BeeNoisy พูด คุณควรใช้ getResourceAsSreame(...) แทน getResource(...).getFile()

ฉันเห็นปัญหาของคุณอย่างแน่นอนและรหัสของฉันทำงานในคอมพิวเตอร์ของฉันอย่างถูกต้อง แต่เมื่อฉันโหลดแอปที่มี Tomcat แบบฝังด้วยคำสั่ง java -jar ฉันเห็นข้อผิดพลาดนี้:

ดังนั้นฉันจึงเปลี่ยนรหัสเช่นนี้และแก้ไขข้อผิดพลาด:

private final String licencePass;
private final String licenceName;

public ProcessFormController(@Value("${ramona.licence.keystore.fullname}") String licenceName,
                             @Value("${ramona.licence.pass}") String licencePass) throws Exception {
    this.licenceName = licenceName;
    this.licencePass = licencePass;
    this.restTemplate = new RestTemplate(getHttpsRequestFactory());
}

private ClientHttpRequestFactory getHttpsRequestFactory() throws Exception {
    logger.info("licenceName:" + licenceName);
    final InputStream resourceAsStream =
            getClass().getClassLoader().getResourceAsStream(
                    licenceName
            );
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(resourceAsStream, licencePass.toCharArray());
    ...
}

คุณสมบัติ:

ramona.licence.keystore.fullname=key.p12
person amir110    schedule 31.03.2020

เส้นทางนี้ใช้ได้กับฉัน cert.file=./build/resources/main/cert.p12

person fjkjava    schedule 08.11.2016