กำลังโหลดไฟล์จาก jar อ้างอิงภายใน maven junit

ฉันใช้ maven 2.1.0 และมีโปรเจ็กต์ที่มีหลายโมดูล โมดูลตัวอย่าง:

  • ทรัพยากรสปริง
  • Spr-ทั่วไป

spr-common มีการพึ่งพาทรัพยากร spr

spr-resources มีเฉพาะไฟล์ ไม่มีคลาส

spr-common มี Junit ที่ต้องการโหลดไฟล์จาก spr-resources jar

ฉันใช้:

String fileName = getClass().getResource("/jaskeyfile.3DES").getFile();
is = getClass().getClassLoader().getResourceAsStream(fileName);
is.read(data);

และสิ่งนี้ใช้ได้เมื่อฉันรันการทดสอบใน IntelliJ แต่เมื่อฉันทำการทดสอบ mvn มันจะล้มเหลวด้วย NullPointerException เมื่อฉันพยายามจะ read() กับมัน

ทำไมสิ่งนี้ถึงเกิดขึ้น? ควรอ่านไฟล์จากการพึ่งพาได้ดี

นอกจากนี้ pom.xml ใน spr-common ยังขึ้นอยู่กับทรัพยากร spr (ลองทั้งแบบทดสอบขอบเขตและไม่ใช้)

แก้ไข: ฉันก็ลองด้วย

getClass().getClassLoader().getResourceAsStream("/jaskeyfile.3DES");

ไม่มีโชค

แก้ไข 2: ไฟล์ที่กำหนดมีอยู่ใน jar ที่เป็นผลลัพธ์ ดังนั้นฉันเดาว่ามันควรจะสามารถเข้าถึงได้


person Krzysztof Krasoń    schedule 07.12.2010    source แหล่งที่มา
comment
อืม นั่นก็แปลกนะ คุณได้ลองวิธีที่ง่ายกว่านี้: InputStream is = getClass().getResourceAsStream("/java/pkg/with/your/file/filename.txt"); แล้วหรือยัง? การพึ่งพา spr-resources ถูกกำหนดไว้ในไฟล์ pom.xml จริงๆ และไม่ใช่แค่ใน IDE ของคุณเท่านั้น สตรีมที่ส่งคืนคือ null หากไม่พบทรัพยากรใน CLASSPATH แก้ไข: ไฟล์อยู่ใน spr-resources ในไดเรกทอรี src/main/resources/java/pkg/with/your/file/filename.txt จริงๆ หรือไม่   -  person Jiri Patera    schedule 07.12.2010
comment
หากคุณรันการทดสอบ mvn การทดสอบจะถูกรันในเครื่องบนโมดูลนี้โดยเฉพาะ หากคุณต้องการทรัพยากร spr ของโมดูลอื่น คุณต้องกำหนดให้เป็นการพึ่งพาการทดสอบ ไม่เช่นนั้นคุณจะไม่เห็นสิ่งนี้ในกรณีทดสอบของคุณ   -  person khmarbaise    schedule 07.12.2010
comment
ฉันคิดว่าคุณเห็นการคอมไพล์ทั้งหมดรวมถึงการพึ่งพาการทดสอบ ดังนั้นจึงไม่จำเป็นต้องกำหนดให้เป็นการพึ่งพาการทดสอบ   -  person Jiri Patera    schedule 07.12.2010
comment
คำถามเก่า แต่คุณไม่เคยให้ข้อเสนอแนะเกี่ยวกับเรื่องนี้!? :/   -  person bugske    schedule 11.04.2013


คำตอบ (2)


ตรวจสอบทุกอย่างอย่างรอบคอบ

นี่คือรายการที่ต้องดำเนินการ:

  1. ไฟล์ jaskeyfile.3DES อยู่ใน src/main/resources ภายในโมดูล spr-resources
  2. พื้นที่เก็บข้อมูลในเครื่องของคุณมีspr-resources-x.y.z-SNAPSHOT.jar เวอร์ชันล่าสุด (หรือคุณได้เผยแพร่/กำหนดเวอร์ชันโดยตรง) และคุณได้ใช้ mvn clean install แล้ว
  3. โมดูล spr-common อ้างอิงถึงเวอร์ชันที่ถูกต้อง (ชื่อ) ของ spr-resources-x.y.z.jar (ขอบเขตของการคอมไพล์จะเห็นได้ทั้งบนคลาสพาธการทดสอบและคอมไพล์)

หากทั้งหมดที่กล่าวมาข้างต้นเป็นจริง แสดงว่าคำขอ getClass().getResourceAsStream("/jaskeyfile.3DES") ของคุณควรใช้งานได้ ฉันใช้โครงสร้างนี้ตลอดเวลาในโครงการของฉัน ดังนั้นคุณไม่ต้องถามถึงดวงจันทร์หรืออะไรที่นี่

person Gary Rowe    schedule 08.12.2010

ฉันเชื่อว่าปัญหาอาจอยู่ที่เครื่องหมายทับนำหน้า ฉันคิดว่าทั้งสองอย่างนี้น่าจะได้ผล:

  • getClass().getResourceAsStream("/jaskeyfile.3DES")
  • getClass().getClassLoader().getResourceAsStream("jaskeyfile.3DES")

Class.getResourceAsStream() ใช้พาธที่สัมพันธ์กับไดเร็กทอรีแพ็กเกจของคลาส ดังนั้นจึงยอมรับเครื่องหมายทับนำหน้า

ClassLoader.getResourceAsStream() ใช้เส้นทางที่แน่นอนอยู่แล้ว ดังนั้นจึงไม่ยอมรับเครื่องหมายทับนำหน้า

person trask    schedule 07.12.2010
comment
ฉันลองทั้ง classloader และรับคลาส getResourceAsStream ทั้งแบบมีสแลชและไม่มีเลย - person Krzysztof Krasoń; 08.12.2010