[英]Python Jpype can't see Java classes in JAR file
我正在嘗試解決應該是一個簡單的問題,但我遺漏了一些東西。 我有一個非常簡單的 Java 類:
package blah.blah;
public class Tester {
public String testMethod1() { return "GotHere"; }
public String testMethod2() { return "GotHereToo"; }
} // Tester
我試圖讓它加載到 JPype:
import jpype
import jpype.imports
from jpype.types import *
path_to_jvm = "C:\\Java\\OracleJDK-8_241_x64\\jre\\bin\\server\\jvm.dll"
jpype.startJVM(path_to_jvm, classpath=["C:\\Users\\Administrator\\eclipse-workspace\\JpypeTest\\src;"])
from java.lang import System
print(System.getProperty("java.class.path"))
from java.io import ObjectInputStream
from blah.blah import Tester
tester = Tester()
print(tester.testMethod1())
print(tester.testMethod2())
jpype.shutdownJVM()
當我使用上面的代碼直接加載類時,一切正常。 當我嘗試讓它通過 JAR 加載類文件時,它停止工作。
jpype.startJVM(path_to_jvm, classpath=["C:\\Users\\Administrator\\JpypeTest.jar;"])
我得到的錯誤是:
Traceback (most recent call last):
File ".\jpype_test.py", line 16, in <module>
from blah.blah import Tester
ModuleNotFoundError: No module named 'blah'
PS C:\Users\Administrator> python .\jpype_test.py
C:\Users\Administrator\JpypeTest.jar;
Traceback (most recent call last):
File ".\jpype_test.py", line 16, in <module>
from blah.blah import Tester
ModuleNotFoundError: No module named 'blah'
我使用 JAR 導出從 Eclipse 2020/09 和命令行使用以下幾種不同的方式構建了 JAR 文件:
C:\Users\Administrator\eclipse-workspace\JpypeTest\src>"C:\Java\OracleJDK-8_241_x64\bin"\jar cf C:\Users\Administrator\JpypeTest.jar blah\blah\*.class
我已經確認 JVM 和 python 解釋器都是 64 位的。 我也已盡力確保 Eclipse、命令行和 Python 之間的 JVM 完全相同。
從我所見,無論我如何構建 JAR,它看起來都很好。 它包含 blah\\blah 目錄和其下的 Tester.class 文件。 清單是 JAR 中唯一的其他文件。
我還嘗試在不同的目錄級別(即一級 blah 目錄和沒有 blah 目錄級別)創建帶有類文件的 JAR 文件。
以下是python軟件的版本:
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Package Version
------------ -------------------
certifi 2020.6.20
JPype1 1.0.2
pip 20.2.3
setuptools 50.3.0.post20201006
wheel 0.35.1
wincertstore 0.2
我顯然有基礎管道工作,因為它可以看到類文件。 關於為什么 JAR 失敗的任何想法?
非常感謝您的考慮。
檢查您是否沒有名為“blah”的目錄,python 會在該目錄中查找模塊。 這將隱藏您的 Java 類,根據https://jpype.readthedocs.io/en/latest/userguide.html#importing-java-classes :
處理導入 Java 模塊時的一個重要警告。 Python 總是在調用 Java 導入器之前將本地目錄作為模塊導入。 因此,任何名為 java、com 或 org 的目錄都將隱藏相應的 Java 包。 我們建議不要將目錄命名為 java 或頂級域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.