Cách thêm thư viện gốc vào “java.library.path” bằng khởi chạy Eclipse (thay vì ghi đè nó)


90

Tôi có một thư viện gốc cần được thêm vào java.library.path . Với đối số JVM -Djava.library.path = path ... Tôi có thể đặt đường dẫn như tôi muốn.

Vấn đề của tôi là thư viện khác của tôi (báo cáo pentaho) tìm kiếm phông chữ dựa trên java.library.path mặc định (bao gồm cả thư mục hệ thống, v.v.) và cài đặt thủ công ghi đè đường dẫn mặc định.

Vì vậy: làm cách nào để thêm mục nhập đường dẫn vào java.library.path mặc định thay vì ghi đè nó (dường như được thực hiện với -Djava.library.path)? (Tôi không muốn thêm đường dẫn mặc định theo cách thủ công, điều này sẽ không tốt cho việc triển khai)

EDIT: Xin lỗi vì thiếu chi tiết; Tôi đang làm việc với Eclipse. (Việc triển khai được thực hiện với JNLP và ở đó tôi có thể sử dụng nativelib trong tài nguyên )


1
xin xem câu trả lời được chấp nhận cho câu hỏi này để thay thế - đối với tôi nó là tốt hơn nhiều: stackoverflow.com/questions/957700/...
laher

Câu hỏi "làm thế nào để thêm thư viện gốc vào .." là khó hiểu. Nó có thể là về việc thêm (thêm hoặc thêm) một "đường dẫn thư viện" khác, tức là giả sử rằng Eclipse hiển thị một cái gì đó giống như java.library.path = path1: path2: path3 theo mặc định, câu hỏi là làm thế nào để bắt đầu Eclipse kết thúc bằng java.library .path = tôi / lib / thư mục: path1: path2: path3
whaefelinger

Câu trả lời:


46

Đã quên vấn đề này ... Tôi thực sự đã hỏi với Eclipse, xin lỗi vì đã không nói rõ điều đó ban đầu. Và câu trả lời dường như quá đơn giản (ít nhất là với 3.5; có thể với các phiên bản cũ hơn):

Đối số của cấu hình chạy Java: Đối số VM:

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

Không được quên dấu ngoặc kép, nếu không sẽ có vấn đề với khoảng trắng trong PATH.


7
Nếu có hai thư viện dùng chung, một thư viện phụ thuộc vào thư viện kia, điều này sẽ không hoạt động. Đầu tiên được tìm thấy bởi thời gian chạy Java, nhưng thứ hai được giải quyết bởi trình tải động hệ thống. Giải pháp duy nhất tôi đã tìm thấy là đặt LD_LIBRARY_PATH.
kevin cline

4
Câu trả lời do @Touko đưa ra không phù hợp với câu hỏi ban đầu về việc thêm hoặc thêm một thư mục thư viện gốc. Ít nhất là trên Mac OS 10.8, $ PATH hay $ LD_LIBRARY_PATH hay $ {workspace_loc: project} \ lib đều không liên quan đến giá trị mặc định. Ví dụ: trên máy Mac của tôi, giá trị mặc định là $ HOME / Library / Java / Phần mở rộng: / Thư viện / Java / Phần mở rộng: / Mạng / Thư viện / Java / Phần mở rộng: / Hệ thống / Thư viện / Java / Phần mở rộng: / usr / lib / java :.
whaefelinger

Nếu bạn đang sử dụng TestNG trong Eclipse, bạn sẽ cần chỉnh sửa cấu hình chạy TestNG: - Trong cửa sổ Run Configurations, chọn cấu hình TestNG mục tiêu của bạn. - Chọn tab Môi trường - Thêm biến PATH và đặt giá trị của nó cho mục tiêu của bạn - Để chuyển đổi mặc định "Nối môi trường vào môi trường gốc".
Philippe

Tôi có thể lấy một ví dụ.
basickarl

@kevincline, bạn có vui lòng giải thích lý do chính xác tại sao nó không hoạt động trong trường hợp đó không? Tôi vừa gặp phải vấn đề đó và tôi đang cố gắng tìm hiểu xem có gì sai với giải pháp này.
anula

14

Nếu bạn muốn thêm thư viện gốc mà không can thiệp java.library.pathvào thời gian phát triển trong Eclipse (để tránh bao gồm các đường dẫn tuyệt đối và phải thêm các tham số vào cấu hình khởi chạy của bạn), bạn có thể cung cấp đường dẫn đến vị trí thư viện gốc cho mỗi Jar trong Bản dựng Java Hộp thoại đường dẫn trong Vị trí thư viện gốc . Lưu ý rằng tên tệp thư viện gốc phải tương ứng với tên tệp Jar. Xem thêm mô tả chi tiết này .


3
-1. Bạn đang giả định rằng người dùng cuối đang chạy ứng dụng từ IDE, điều này khó xảy ra.
finnw

@finnw Tôi thấy quan điểm của bạn. Tôi tìm thấy câu hỏi đang tìm kiếm giải pháp về cách thêm thư viện gốc trong IDE trong quá trình phát triển, mà không cần ghi đè java.library.pathvà quay lại sau khi tìm thấy giải pháp ở nơi khác. Sẽ chỉnh sửa câu trả lời của tôi để làm rõ ràng hơn.
Fabianamondsg

Trên thực tế, tôi đang làm việc với Eclipse mặc dù tôi không đề cập đến nó ở câu hỏi.
Touko

Điều này thực sự không hoạt động trong phiên bản hiện tại của Eclipse (Luna) vì thiết lập thuộc tính ghi đè java.library.path giống như người dùng mô tả là một vấn đề trong câu hỏi.
Alex N.

9

SWT đặt các DLL gốc cần thiết vào một JAR. Tìm kiếm "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" để làm ví dụ.

Các DLL phải nằm trong thư mục gốc của JAR, JAR phải được ký và DLL phải xuất hiện với tổng kiểm tra trong META-INF / MANIFEST.MF để VM nhận chúng.


2
Làm cách nào tôi có thể làm điều đó với NetBeans?
Maciek Sawicki

AFAIK, NetBeans sử dụng Ant để xây dựng dự án. Đọc tài liệu cho Ant cách tạo JAR đã ký và cách đưa những thứ như DLL vào tệp kê khai.
Aaron Digulla

Làm cách nào để đặt nó để thêm .dll, trong Eclipse?
NoBugs

@NoBugs: Trong Eclipse, bài đăng này sẽ hữu ích: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla

@AaronDigulla Bạn có đề xuất rằng DLL có thể luôn được đính kèm theo cách này không? Tôi nghĩ rằng nó chỉ tìm kiếm một cái gì đó giống như java.library.path. Bạn có đề nghị rằng nó chỉ tìm kiếm gốc của jar?

4

Trong Windows, như thế này:

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

% PATH% là -Djava.library.path cũ của bạn


Đã thử ý tưởng này nhưng kết quả là java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko

Bạn cũng có thể sử dụng $ {system_property: java.library.path}
Rob Elsner

2
Mặc định trên UNIX / Mac / GNU Linux là LD_LIBRARY_PATH. PATH là một thứ của Windows.
whaefelinger

2

Bạn có thể giải quyết vấn đề này bằng cách gọi System.load () theo chương trình để tải thư viện gốc của bạn không? Phương thức này (không giống như System.loadLibrary () ) cho phép bạn chỉ định một đường dẫn tuyệt đối.


1
Vui lòng giải thích cách bạn sẽ gọi System.load () theo chương trình khi khởi chạy Eclipse?
whaefelinger vào

2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 tuyên bố rằng không có cơ chế thay thế nào được triển khai trong trình khởi chạy của Eclipse, ít nhất là không cần phát hành Juno.

Vì vậy, hầu như không thể nối hoặc thêm một thư mục thư viện khác vào java.library.path khi khởi chạy Eclipse mà không biết trước về cài đặt mặc định.

Tôi đã viết gần hết, vì có thể để cho Eclipse khởi động, kết xuất nội dung của java.library.path và dừng Eclipse trong một lệnh. Kết xuất sẽ được phân tích cú pháp và sau đó được lấy làm đầu vào để khởi chạy Eclipse, tức là

#!/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}"

1

Trong hệ thống UNIX, bạn có thể thêm vào biến môi trường LD_LIBRARY_PATH. Trên Windows, JVM tự động đặt thuộc tính hệ thống, java.library.path, thành PATH; vì vậy nếu dll nằm trên PATH của bạn, thì bạn đã đặt xong.


Trình khởi động chủ đề rất cụ thể về cách "nối" thư mục thư viện gốc thứ hai, bạn có đồng ý không?
whaefelinger

@ user667073 tôi đã nói như vậy ... phụ thêm được các câu hỏi, các thread-khởi động đã biết làm thế nào để tải một lib chia sẻ khác ;-)
Ustaman Sangat

STS 3.4.0 và Mac OS 10.8: Cài đặt của LD_LIBRARY_PATH không có bất kỳ tác động nào đến java.library.path. Tôi đã thử nghiệm điều này với Subclipse / JavaHL. Cái này hoạt động: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib trong khi xuất LD_LIBRARY_PATH = / opt / local / lib; STS đã âm.
whaefelinger

1

Window-> Preferences-> Java-> JREs đã cài đặt. Sau đó chọn JRE (JDK) hiện tại của bạn và nhấp vào Chỉnh sửa. Điền đối số VM mặc định: -Djava.library.path = / usr / local / xuggler / lib. Làm xong!


1
Câu trả lời này là vô ích vì trình khởi động chủ đề hỏi cụ thể về "Cách thêm thư viện gốc [..] thay vì ghi đè [..]". Câu trả lời này chỉ ghi đè cài đặt mặc định.
whaefelinger

1

Giải pháp do Rob Elsner đưa ra trong một trong các nhận xét ở trên hoạt động hoàn hảo (OSX 10.9, Eclipse Kepler). Người ta phải nối các đường dẫn bổ sung của họ vào đường dẫn được phân tách bằng ":".

Bạn cũng có thể sử dụng $ {system_property: java.library.path} - Rob Elsner 22 '10 tháng 11 lúc 23:01


0

Tên tệp thư viện gốc phải tương ứng với tên tệp Jar. Điều này là rất, rất quan trọng. Hãy đảm bảo rằng tên jar và tên dll giống nhau. Ngoài ra, vui lòng xem bài đăng từ FabianLESg Nội dung tải xuống của tôi cho hàm chứa các tên khác nhau cho dll và jar. Đó là functionsin.jar và functionsin d .dll, lưu ý thêm 'd' trong tên tệp dll. Tôi chỉ cần đổi tên nó thành functionsin.dll và đặt nó làm thư viện gốc trong eclipse như đã đề cập trong bài đăng " http://www.eclipsezone.com/eclipse/forums/t49342.html "


Câu hỏi là về việc thêm một thư viện gốc (thư mục) khi khởi chạy Eclipse.
whaefelinger

0

Vì một số lý do, tôi không thể làm cho nhiều thư mục hoạt động (nó đã hoạt động tốt trong một thời gian nhưng ngay sau khi tôi cần thêm tệp và thêm nhiều thư mục hơn, không có thư mục nào có khoảng trắng trong đường dẫn). Sau đó, tôi đã sao chép tất cả các dll cần thiết vào một thư mục và có nó như java.library.path của tôi và nó hoạt động. Tôi không có lời giải thích - nếu ai đó làm vậy thì thật tuyệt.


Chà, nếu thư viện gốc được tìm thấy qua java.library.path và bạn sao chép một thư viện khác vào thư mục đó, thì có vẻ như thư viện thứ hai cũng được tìm thấy, phải không?
whaefelinger

Tất nhiên, đó là lý do tại sao tôi sử dụng nó, duh! Điều tôi băn khoăn là liệu người ta có thể thêm nhiều thư mục vào đó mà không cần phải di chuyển hoặc liên kết biểu tượng xung quanh hay không.
Ustaman Sangat

0

Nhiều câu trả lời hiện có giả sử bạn muốn đặt điều này cho một dự án cụ thể, nhưng tôi cần đặt nó cho chính Eclipse để hỗ trợ xác thực tích hợp cho trình điều khiển SQL Server JDBC.

Để thực hiện việc này, tôi đã làm theo các hướng dẫn sau để khởi chạy Eclipse từ dòng lệnh Java thay vì trình khởi chạy bình thường của nó. Sau đó, tôi vừa sửa đổi tập lệnh đó để thêm đối số -Djava.library.path của mình vào dòng lệnh Java.


0
  1. Trên Windows: Thêm đường dẫn đến thư viện vào biến môi trường PATH.
  2. Trên Linux: Thêm đường dẫn đến thư viện vào biến môi trường LD_LIBRARY_PATH.
  3. Trên Mac: Thêm đường dẫn đến thư viện vào biến môi trường DYLD_LIBRARY_PATH.

java.library.path được bắt đầu bằng các giá trị của các biến ở trên trên nền tảng tương ứng của nó.

Điều này sẽ hoạt động trên bất kỳ IDE nào.

Bạn có thể kiểm tra xem giá trị có phải là những gì bạn mong đợi hay không bằng cách gọi java -XshowSettings:properties


-2

Trên Windows, tôi nhận thấy rằng điều quan trọng là khởi động Eclipse từ dòng lệnh chứ không phải từ Start Menu hoặc một phím tắt, miễn là DLL gốc nằm trong một thư mục trong PATH của bạn. Rõ ràng, điều này đảm bảo rằng thư mục thích hợp nằm trên đường dẫn.


Hãy sửa cho tôi nếu tôi sai nhưng tôi tin rằng thư mục làm việc hiện tại trên Windows được tự động đưa vào khi tìm kiếm các tệp DLL (hoặc tệp nhị phân thực thi). Do đó, khi bạn thay đổi thư mục chứa các tệp DLL và khởi động sau đó khởi động Eclipse, thì có, các tệp DLL bạn đang tìm sẽ được tìm thấy. Ngoài ra, câu trả lời này có liên quan như thế nào đến câu hỏi bắt đầu chuỗi?
whaefelinger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.