รวม Excel ไว้ในไฟล์ปฏิบัติการ .jar

ฉันต้องอ่านข้อมูลจากไฟล์ Excel และแสดงข้อมูลในแอปพลิเคชันของฉัน ฉันต้องการจัดแพ็คเกจไฟล์ Excel (ไฟล์ข้อมูล) ของฉันพร้อมกับ jar ที่ปฏิบัติการได้ ฉันได้สร้างโฟลเดอร์ต้นทางภายในโฟลเดอร์โปรเจ็กต์หลักของฉันและตั้งชื่อว่า 'res' ภายใน 'res' ฉันมี 2 โฟลเดอร์ย่อย (โฟลเดอร์ปกติ) ชื่อ "images" และ "data" ภายในโฟลเดอร์ data ฉันวางไฟล์ excel ไว้

โครงสร้างโครงการของฉัน

โครงสร้างโครงการ

สร้างเส้นทาง

เส้นทางการสร้างของโครงการ

ส่งออกเป็น JAR

ป้อนคำอธิบายรูปภาพที่นี่

ปัญหา:

แอปพลิเคชันทำงานได้อย่างไร้ที่ติเมื่อฉันเรียกใช้จาก Eclipse แต่เมื่อฉันส่งออกเป็น jar แอปพลิเคชันไม่ทำงาน แอปพลิเคชันสามารถค้นหารูปภาพได้ แต่ไม่พบไฟล์ Excel

กล่าวอีกนัยหนึ่งเมื่อฉันเรียกใช้แอปพลิเคชันจากภายใน eclipse (คลิกขวา -> เรียกใช้เป็น -> แอปพลิเคชัน Java) มันจะทำงานได้อย่างสมบูรณ์แบบ แต่เมื่อเปิดไฟล์ JAR ที่ส่งออก ("Tool.jar") จะไม่สามารถอ่านข้อมูล Excel ได้

โค้ดสำหรับอ่าน Excel

URL excelResources = getClass().getResource("/excel/data.xls");
File excel = new File(excelResources.toURI());
FileInputStream fis = new FileInputStream(excel);

person Partha Chetry    schedule 30.03.2015    source แหล่งที่มา
comment
getClass().getResource("/res/data/MyAwesome.xls") จะให้ URL แก่คุณในไฟล์ Excel ของคุณ getClass().getResourceAsStream("/res/data/MyAwesome.xls") จะส่งคืน InputStream ไปยังไฟล์ Excel ของคุณ...   -  person MadProgrammer    schedule 30.03.2015
comment
คุณช่วยเพิ่มรายละเอียดเกี่ยวกับวิธีเข้าถึงรูปภาพและ Excel ได้ไหม และข้อผิดพลาดหากคุณมี   -  person sathya_dev    schedule 30.03.2015
comment
หากต้องการความช่วยเหลือที่ดีกว่าเร็วกว่านี้ โปรดโพสต์ MCVE (ตัวอย่างที่ตรวจสอบได้ครบถ้วนสมบูรณ์น้อยที่สุด) หรือ SSCCE (สั้น สมบูรณ์ในตัวเอง ตัวอย่างที่ถูกต้อง)   -  person Andrew Thompson    schedule 30.03.2015
comment
stackoverflow.com/a/25636097/2587435   -  person Paul Samsotha    schedule 30.03.2015
comment
@peeskillet :- ขอบคุณที่ชี้ให้ฉันไปที่ลิงค์นี้ ฉันลองใช้แล้วแต่ไม่สามารถแก้ไขปัญหาได้ ปัญหาเกิดขึ้นกับไฟล์ .jar ที่ส่งออก สามารถค้นหาภาพได้แต่ไม่สามารถโหลดไฟล์ Excel ได้ กรุณาช่วย.   -  person Partha Chetry    schedule 31.03.2015
comment
@MadProgrammer :- ขอบคุณ ฉันกำลังอ่าน Excel ของฉันแบบเดียวกับที่คุณพูดถึง มันทำงานได้ดีเมื่อฉันเปิดโปรเจ็กต์ด้วย Eclipse แต่เมื่อฉันพยายามรันไฟล์ jar ที่ส่งออก มันไม่สามารถอ่านไฟล์ Excel รวมอยู่ด้วย กรุณาช่วย.   -  person Partha Chetry    schedule 31.03.2015
comment
ใช้ getResourceAsStream (แทน getResource) ซึ่งส่งคืน InputStream หากต้องการอ่านคุณสามารถทำได้ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));   -  person Paul Samsotha    schedule 31.03.2015
comment
การรวมผลลัพธ์ของ getResource ในไฟล์ไม่ใช่สิ่งที่คุณควรทำ ไม่สามารถเข้าถึงไฟล์ Excel ได้เหมือนกับไฟล์ในระบบ เนื่องจากไม่ได้เป็นเช่นนั้น มันเป็นส่วนหนึ่งของไฟล์ jar หากคุณต้องการ InputStream ให้ใช้ getAsStream แทน   -  person MadProgrammer    schedule 31.03.2015


คำตอบ (2)


นี้...

URL excelResources = getClass().getResource("/excel/data.xls");
File excel = new File(excelResources.toURI());
FileInputStream fis = new FileInputStream(excel);

ไม่ใช่วิธีการทำงานของทรัพยากรที่ฝังตัว คุณไม่สามารถเข้าถึงไฟล์ Excel เหมือนกับว่าเป็นไฟล์บนระบบไฟล์ได้อีกต่อไป เพราะไม่ใช่ ไฟล์นั้นฝังอยู่ภายในไฟล์ Jar

หากคุณต้องการ InputStream ให้ใช้ Class#getResourceAsStream

try (InputStream is = getClass().getResourceAsStream("/excel/data.xls")) {
    //...
} catch (IOException exp) {
    exp.printStackTrace();
}
person MadProgrammer    schedule 31.03.2015

การใช้ maven สามารถทำได้โดยใช้ปลั๊กอิน:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>your.class.Name</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <resources>
                        <resource>
                            <directory>${basedir}/src/main/res/data</directory>
                            <filtering>false</filtering>
                        </resource>
                    </resources>
                </configuration>

                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
person szefuf    schedule 30.03.2015