Cara menambahkan pustaka asli ke "java.library.path" dengan peluncuran Eclipse (bukan menimpanya)

92

Saya mendapat perpustakaan asli yang perlu ditambahkan ke java.library.path . Dengan argumen JVM -Djava.library.path = path ... Saya bisa mengatur path sesuai keinginan.

Masalah saya adalah bahwa perpustakaan saya yang lain (pelaporan pentaho) mencari font berdasarkan default java.library.path (termasuk direktori sistem dll) dan pengaturan manual menimpa jalur default ..

Jadi: bagaimana saya bisa menambahkan entri path ke java.library.path default daripada menimpanya (yang tampaknya dilakukan dengan -Djava.library.path)? (Saya tidak ingin menambahkan jalur default secara manual, yang tidak akan bagus demi penerapan)

EDIT: Maaf untuk detail yang hilang; Saya bekerja dengan Eclipse. ( Penerapan dilakukan dengan JNLP dan di sana saya dapat menggunakan nativelib di bawah sumber daya )

Touko
sumber
1
tolong lihat jawaban yang diterima untuk pertanyaan ini sebagai gantinya - bagi saya itu jauh lebih baik: stackoverflow.com/questions/957700/…
laher
Pertanyaan "bagaimana cara menambahkan pustaka asli ke .." membingungkan. Ini mungkin tentang menambahkan (menambahkan atau menambahkan) "jalur perpustakaan" lain, yaitu dengan asumsi bahwa Eclipse menunjukkan sesuatu seperti java.library.path = path1: path2: path3 secara default, pertanyaannya adalah bagaimana memulai Eclipse yang berakhir di java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

Jawaban:

46

Telah melupakan masalah ini ... Saya sebenarnya bertanya dengan Eclipse, maaf karena tidak menyatakannya pada awalnya. Dan jawabannya tampaknya terlalu sederhana (setidaknya dengan 3.5; mungkin dengan versi yang lebih lama juga):

Argumen konfigurasi yang dijalankan Java: Argumen VM:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

Jangan lupa tanda petiknya, jika tidak, ada masalah dengan spasi di PATH.

Touko
sumber
7
Jika ada dua pustaka bersama, yang satu bergantung pada yang lain, ini tidak akan berfungsi. Yang pertama ditemukan oleh runtime Java, tetapi yang kedua diselesaikan oleh pemuat dinamis sistem. Satu-satunya solusi yang saya temukan adalah mengatur LD_LIBRARY_PATH.
kevin cline
4
Jawaban yang diberikan oleh @Touko tidak sesuai dengan pertanyaan awal yaitu tentang menambah atau mempersiapkan folder perpustakaan asli. Setidaknya di Mac OS 10.8, baik $ PATH atau $ LD_LIBRARY_PATH atau $ {workspace_loc: project} \ lib tidak ada hubungannya dengan nilai default. Misalnya, di Mac saya, nilai defaultnya adalah $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger
Jika Anda menggunakan TestNG di Eclipse, Anda perlu mengedit konfigurasi run TestNG: - Di jendela Run Configurations, pilih konfigurasi TestNG target Anda. - Pilih tab Lingkungan - Tambahkan variabel PATH dan tetapkan nilainya ke target Anda - Biarkan tombol default "Tambahkan lingkungan ke lingkungan asli".
Philippe
Bisakah saya mendapatkan contoh.
basickarl
@kevincline Maukah Anda menjelaskan mengapa sebenarnya itu tidak akan berhasil dalam kasus itu? Saya baru saja mengalami masalah itu dan saya mencoba memahami apa yang salah dengan solusi ini.
anula
14

Jika Anda ingin menambahkan perpustakaan asli tanpa mengganggu java.library.pathwaktu pengembangan di Eclipse (untuk menghindari menyertakan jalur absolut dan harus menambahkan parameter ke konfigurasi peluncuran Anda), Anda dapat menyediakan jalur ke lokasi perpustakaan asli untuk setiap Jar di Java Build Dialog jalur di bawah Lokasi perpustakaan asli . Perhatikan bahwa nama file perpustakaan asli harus sesuai dengan nama file Jar. Lihat juga penjelasan rinci ini .

Fabian Steeg
sumber
3
-1. Anda mengasumsikan pengguna akhir menjalankan aplikasi dari IDE, yang kemungkinannya kecil.
finnw
@nnn saya mengerti maksud anda. Saya menemukan pertanyaan mencari solusi tentang bagaimana menambahkan perpustakaan asli di IDE selama pengembangan, tanpa menimpa java.library.pathdan kembali setelah menemukan solusi di tempat lain. Akan mengedit jawaban saya untuk membuatnya lebih jelas.
Fabian Steeg
Sebenarnya saya bekerja dengan Eclipse meskipun saya tidak menyebutkannya di pertanyaan.
Touko
Ini sebenarnya tidak berfungsi dalam versi Eclipse (Luna) saat ini karena pengaturan properti akan menggantikan java.library.path seperti yang dijelaskan pengguna sebagai masalah dalam pertanyaan.
Alex N.
9

SWT menempatkan DLL native yang diperlukan ke dalam JAR. Telusuri "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" sebagai contoh.

DLL harus berada di root JAR, JAR harus ditandatangani dan DLL harus muncul dengan checksum di META-INF / MANIFEST.MF agar VM dapat mengambilnya.

Aaron Digulla
sumber
2
Bagaimana saya bisa melakukannya dengan NetBeans?
Maciek Sawicki
AFAIK, NetBeans menggunakan Ant untuk membangun proyek tersebut. Baca dokumentasi tentang Ant cara membuat JAR bertanda tangan dan cara memasukkan DLL ke dalam manifes.
Aaron Digulla
Bagaimana cara mengaturnya untuk menambahkan .dll, di Eclipse?
NoBugs
@NoBugs: Di Eclipse, posting ini akan membantu: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla
@AaronDigulla Apakah Anda menyarankan agar DLL selalu terpasang dengan cara ini? Saya pikir itu hanya mencari sesuatu seperti java.library.path. Apakah Anda menyarankan bahwa itu hanya mencari akar jar?
4

Di Windows, seperti ini:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% adalah -Djava.library.path lama Anda

andy boot
sumber
Mencoba ide ini tetapi menghasilkan java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
Anda juga dapat menggunakan $ {system_property: java.library.path}
Rob Elsner
2
Default pada UNIX / Mac / GNU Linux adalah LD_LIBRARY_PATH. PATH adalah hal Windows.
whaefelinger
2

Bisakah Anda mengatasi ini dengan memanggil System.load () secara terprogram untuk memuat perpustakaan asli Anda? Metode ini (tidak seperti System.loadLibrary () ) memungkinkan Anda menentukan jalur absolut.

Simon Nickerson
sumber
1
Jelaskan bagaimana Anda akan memanggil System.load () secara terprogram saat meluncurkan Eclipse?
whaefelinger
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 menyatakan bahwa tidak ada mekanisme substitusi yang diterapkan di peluncur Eclipse, setidaknya tidak hingga rilis Juno.

Oleh karena itu (hampir) tidak mungkin untuk menambahkan atau menambahkan folder pustaka lain ke java.library.path saat meluncurkan Eclipse tanpa pengetahuan sebelumnya tentang setelan default.

Saya menulis hampir, karena itu memungkinkan untuk membiarkan Eclipse startup, membuang konten java.library.path dan menghentikan Eclipse dalam satu perintah. Dump tersebut akan diurai dan kemudian diambil sebagai masukan untuk meluncurkan Eclipse, yaitu

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"
whaefelinger
sumber
1

Dalam sistem UNIX, Anda dapat menambahkan variabel lingkungan LD_LIBRARY_PATH. Pada Windows, JVM secara otomatis menyetel properti sistem, java.library.path, ke PATH; jadi jika dll ada di PATH Anda, maka Anda sudah siap.

geowa4
sumber
Thread starter sangat spesifik tentang cara "menambahkan" folder pustaka asli kedua, setuju?
whaefelinger
@ user667073 Saya telah mengatakan hal yang sama ... TAMPILAN adalah pertanyaannya, thread-starter sudah tahu cara memuat lib bersama jika tidak ;-)
Ustaman Sangat
STS 3.4.0 dan Mac OS 10.8: Pengaturan LD_LIBRARY_PATH tidak berdampak apa pun pada java.library.path. Saya menguji ini dengan Subclipse / JavaHL. Yang ini berhasil: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib sambil mengekspor LD_LIBRARY_PATH = / opt / local / lib; STS negatif.
whaefelinger
1

Jendela-> Preferensi-> Java-> JRE Terinstal. Kemudian pilih JRE (JDK) Anda saat ini dan klik Edit. Isi Argumen VM Default: -Djava.library.path = / usr / local / xuggler / lib. Selesai!

Vadym
sumber
1
Jawaban ini tidak berguna karena thread starter secara khusus menanyakan tentang "Bagaimana cara menambahkan pustaka asli [..] daripada mengganti [..]". Jawaban ini hanya mengesampingkan pengaturan default.
whaefelinger
1

Solusi yang ditawarkan oleh Rob Elsner di salah satu komentar di atas berfungsi dengan sempurna (OSX 10.9, Eclipse Kepler). Seseorang harus menambahkan jalur tambahannya ke yang dipisahkan oleh ":".

Anda juga dapat menggunakan $ {system_property: java.library.path} - Rob Elsner 22 November '10 pukul 23:01

Johan
sumber
0

Nama file perpustakaan asli harus sesuai dengan nama file Jar. Ini sangat penting. Pastikan nama jar dan nama dll sama. Juga, silakan lihat posting dari Fabian Steeg Unduhan saya untuk jawin berisi nama yang berbeda untuk dll dan jar. Itu jawin.jar dan jawin d .dll, catat tambahan 'd' di nama file dll. Saya hanya mengganti namanya menjadi jawin.dll dan menetapkannya sebagai perpustakaan asli di gerhana seperti yang disebutkan dalam pos " http://www.eclipsezone.com/eclipse/forums/t49342.html "

Dhana
sumber
Pertanyaannya adalah tentang menambahkan perpustakaan asli (folder) saat meluncurkan Eclipse.
whaefelinger
0

Untuk beberapa alasan saya tidak bisa mendapatkan banyak folder untuk bekerja (baik itu dilakukan untuk sementara waktu tetapi segera setelah saya membutuhkan lebih banyak dll dan menambahkan lebih banyak folder, tidak ada yang memiliki ruang putih di jalur). Saya kemudian menyalin semua dll yang diperlukan ke satu folder dan memilikinya sebagai java.library.path saya dan itu berhasil. Saya tidak punya penjelasan - jika ada yang tahu, itu akan bagus.

Ustaman Sangat
sumber
Nah, jika perpustakaan asli ditemukan melalui java.library.path dan Anda menyalin yang lain ke folder itu, maka wajar jika yang kedua juga ditemukan, bukan?
whaefelinger
Tentu saja, itulah mengapa saya menggunakan itu, duh! Apa yang saya pikirkan adalah apakah seseorang dapat menambahkan banyak folder ke dalamnya tanpa harus memindahkan atau menghubungkan barang-barang.
Ustaman Sangat
0

Banyak dari jawaban yang ada menganggap Anda ingin mengatur ini untuk proyek tertentu, tetapi saya perlu mengaturnya untuk Eclipse itu sendiri untuk mendukung otentikasi terintegrasi untuk driver SQL Server JDBC.

Untuk melakukan ini, saya mengikuti petunjuk ini untuk meluncurkan Eclipse dari baris perintah Java alih-alih peluncur normalnya. Lalu saya baru saja memodifikasi skrip itu untuk menambahkan argumen -Djava.library.path saya ke baris perintah Java.

CrazyPyro
sumber
0
  1. Di Windows: Tambahkan jalur ke pustaka ke variabel lingkungan PATH.
  2. Di Linux: Tambahkan jalur ke pustaka ke variabel lingkungan LD_LIBRARY_PATH.
  3. Di Mac: Tambahkan jalur ke perpustakaan ke variabel lingkungan DYLD_LIBRARY_PATH.

java.library.path diawali dengan nilai variabel di atas pada platform yang sesuai.

Ini harus bekerja pada IDE apa pun.

Anda dapat menguji apakah nilainya sesuai dengan yang Anda harapkan dengan menelepon java -XshowSettings:properties

rboc
sumber
-2

Di Windows, saya telah menemukan bahwa yang penting adalah memulai Eclipse dari baris perintah daripada dari Start Menu atau pintasan, asalkan DLL asli ada dalam direktori di PATH Anda. Rupanya, ini memastikan bahwa direktori yang tepat berada di jalurnya.

Alan
sumber
Koreksi saya jika saya salah, tetapi saya yakin bahwa direktori kerja saat ini di Windows secara otomatis disertakan saat mencari DLL (atau binari yang dapat dieksekusi). Jadi ketika Anda mengubah ke folder di mana DLL berada dan mulai kemudian Eclipse up, maka ya, DLL yang Anda cari ditemukan. Selain itu, bagaimana jawaban ini terkait dengan pertanyaan thread starters?
whaefelinger