Sertakan excel dalam file .jar yang dapat dieksekusi

Saya harus membaca data dari file excel dan menampilkan data di aplikasi saya. Saya ingin mengemas file excel saya (file data) bersama dengan jar yang dapat dieksekusi. Saya telah membuat folder sumber di dalam folder proyek utama saya dan menamakannya 'res'. Di dalam 'res', saya memiliki 2 sub-folder (folder normal) bernama "images" dan "data". Di dalam folder data saya telah menempatkan file excel.

Struktur Proyek Saya

struktur proyek

Membangun Jalur

membangun jalur proyek

Ekspor sebagai JAR

masukkan deskripsi gambar di sini

Masalah:

Aplikasi ini berfungsi dengan sempurna ketika saya menjalankannya dari Eclipse tetapi ketika saya mengekspornya sebagai toples, aplikasi tersebut tidak berfungsi. Ia dapat menemukan gambar tetapi gagal menemukan file excelnya.

Dengan kata lain, ketika saya menjalankan aplikasi dari dalam Eclipse (Klik Kanan -> Run As -> Aplikasi Java) itu berjalan dengan sempurna. Namun saat meluncurkan file JAR yang diekspor ("Tool.jar"), data excel gagal dibaca.

Kode untuk Membaca 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 sumber
comment
getClass().getResource("/res/data/MyAwesome.xls") akan memberi Anda URL pada file Excel Anda; getClass().getResourceAsStream("/res/data/MyAwesome.xls") akan mengembalikan InputStream ke file Excel Anda...   -  person MadProgrammer    schedule 30.03.2015
comment
Bisakah Anda menambahkan detail tentang cara Anda mengakses gambar dan excel Anda? dan kesalahan jika Anda mendapatkannya   -  person sathya_dev    schedule 30.03.2015
comment
Untuk bantuan yang lebih baik dan lebih cepat, posting MCVE (Contoh Minimal yang Dapat Diverifikasi Lengkap) atau SSCCE (Contoh Singkat, Mandiri, dan Benar).   -  person Andrew Thompson    schedule 30.03.2015
comment
stackoverflow.com/a/25636097/2587435   -  person Paul Samsotha    schedule 30.03.2015
comment
@peeskillet :- Terima kasih telah mengarahkan saya ke tautan ini. Saya mencobanya tetapi gagal menyelesaikan masalah saya. Masalahnya ada pada file .jar yang diekspor. Ia dapat menemukan gambar tetapi gagal memuat file excel. Tolong bantu.   -  person Partha Chetry    schedule 31.03.2015
comment
@MadProgrammer :- Terima kasih. Saya membaca excel saya dengan cara yang sama seperti yang Anda sebutkan. Ini berfungsi dengan baik ketika saya meluncurkan proyek dengan Eclipse. Tetapi ketika saya mencoba menjalankan file jar yang diekspor, gagal membaca file excel yang disertakan. Tolong bantu.   -  person Partha Chetry    schedule 31.03.2015
comment
Gunakan getResourceAsStream (bukan getResource), yang mengembalikan InputStream. Untuk membacanya, Anda dapat melakukan BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));   -  person Paul Samsotha    schedule 31.03.2015
comment
Membungkus hasil getResource dalam File BUKAN yang seharusnya Anda lakukan. File excel TIDAK BISA diakses seperti File di sistem, karena bukan, itu bagian dari file jar. Sebaliknya, jika Anda memerlukan InputStream, gunakan getAsStream saja   -  person MadProgrammer    schedule 31.03.2015


Jawaban (2)


Ini...

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

Bukan cara kerja sumber daya yang tertanam. Anda tidak dapat lagi mengakses file excel seolah-olah itu adalah file di sistem file, karena bukan itu, melainkan tertanam di dalam file Jar.

Jika Anda memerlukan InputStream, gunakan Class#getResourceAsStream

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

Menggunakan maven itu bisa dilakukan dengan plugin:

<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