Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

python引用jar包,找不到类 #681

Closed
JinmingZhao opened this issue Sep 11, 2018 · 4 comments
Closed

python引用jar包,找不到类 #681

JinmingZhao opened this issue Sep 11, 2018 · 4 comments

Comments

@JinmingZhao
Copy link

JinmingZhao commented Sep 11, 2018

环境: python2.7 jdk1.6.0_45
jar 包版本: tree_split-1.5.jar 和 ansj_seg-5.1.6.jar

代码:
`#!coding=utf-8
import jpype
import os
jvmPath = '/usr/lib/java/jdk1.6.0_45/jre/lib/amd64/server/libjvm.so'
print jvmPath

jars_dir = '/mnt/data/pretrained_models/word2vec_models/jars4ansj'
jars = [os.path.join(jars_dir, 'ansj_seg-5.1.6.jar'), os.path.join(jars_dir, 'tree_split-1.5.jar')]

jvm_cp = "-Djava.class.path={}".format(':'.join(jars))
jpype.startJVM(jvmPath, "-ea", jvm_cp)
print "-----------------"
JDClass = jpype.JClass('org.ansj.splitWord.analysis.NlpAnalysis')
jd = JDClass()
jd.parse("怎么这么麻烦")

jpype.shutdownJVM()`

报错信息:
/usr/lib/java/jdk1.6.0_45/jre/lib/amd64/server/libjvm.so
Traceback (most recent call last):
File "ansj_segment.py", line 13, in
JDClass = jpype.JClass('org.ansj.splitWord.analysis.NlpAnalysis')
File "/home/jinmming/anaconda2/lib/python2.7/site-packages/jpype/_jclass.py", line 73, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.RuntimeExceptionPyRaisable: java.lang.RuntimeException: Class org.ansj.splitWord.analysis.NlpAnalysis not found

之前看报错是由于jdk版本, 后来由jdk1.8换到jdk1.6还是不行, 求大神指教, 看看还有什么遗漏的细节?
jar包的导入没有问题, 就是寻找类的时候报错了.

@JinmingZhao
Copy link
Author

JinmingZhao commented Sep 11, 2018

解决了, 感谢作者开源, 提供给对于 java不熟, 不想用jiaba分词, 对 ansj_seg 念念不忘的同学们一个 python 一个解决方案:
环境: python2.7 jdk1.8.0_161 tree_split-1.5.jar, nlp-lang-1.7.7.jar和 ansj_seg-5.1.6.jar
对于环境, 虽然文档写的jdk1.6, 但是可能是之前的版本, 看最新的jar包的mainfest文件中有jdk的最新版本.
踩了很多坑, 刚开始一直找不到类, 弄了大半天, 各种试jdk版本.
第一注意jdk版本:
第二注意所有依赖包, 看源码发现会引用nlp-lang里面的类
第三注意函数是调用父类 Analysis的方法名称.

`#!coding=utf-8
import jpype
import os
jvmPath = '/usr/lib/java/jdk1.8.0_161/jre/lib/amd64/server/libjvm.so'
print jvmPath

jars_dir = '/mnt/data/pretrained_models/word2vec_models/jars4ansj'
jars = [os.path.join(jars_dir, 'ansj_seg-5.1.6.jar'), os.path.join(jars_dir, 'nlp-lang-1.7.7.jar'), os.path.join(jars_dir, 'tree_split-1.5.jar')]
jvm_cp = "-Djava.class.path={}".format(':'.join(jars))
jpype.startJVM(jvmPath, "-ea", jvm_cp)
SegModel = jpype.JClass('org.ansj.splitWord.analysis.ToAnalysis')
jd = SegModel()
print(jd.parseStr("怎么这么麻烦"))

jpype.shutdownJVM()`

返回信息:
/usr/lib/java/jdk1.8.0_161/jre/lib/amd64/server/libjvm.so
Sep 11, 2018 11:12:25 PM org.ansj.util.MyStaticValue warn
WARNING: not find library.properties in classpath use it by default !
Sep 11, 2018 11:12:25 PM org.ansj.dic.impl.File2Stream info
INFO: path to stream library/ambiguity.dic
Sep 11, 2018 11:12:25 PM org.ansj.library.AmbiguityLibrary error
SEVERE: Init ambiguity library error :org.ansj.exception.LibraryException: path :library/ambiguity.dic file:/home/jinmming/git_manager/paraphrase/bimpm/test_units/library/ambiguity.dic not found or can not to read, path: library/ambiguity.dic
Sep 11, 2018 11:12:25 PM org.ansj.dic.impl.File2Stream info
INFO: path to stream library/default.dic
Sep 11, 2018 11:12:25 PM org.ansj.library.DicLibrary error
SEVERE: Init dic library error :org.ansj.exception.LibraryException: path :library/default.dic file:/home/jinmming/git_manager/paraphrase/bimpm/test_units/library/default.dic not found or can not to read, path: library/default.dic
Sep 11, 2018 11:12:25 PM org.ansj.library.DATDictionary info
INFO: init core library ok use time : 572
Sep 11, 2018 11:12:25 PM org.ansj.library.NgramLibrary info
INFO: init ngram ok use time :287
怎么/r,这么/r,麻烦/an
JVM has been shutdown

@JinmingZhao
Copy link
Author

@ansjsun

@yongzhuo
Copy link

这么弄,报错,求助:
import jpype
import os

jvmPath = 'D:/software/Java/Java8/jre/bin/server/jvm.dll'
print (jvmPath)
jars_dir_ansj_seg = 'D:/software/IDEA/tools/maven_soft/org/ansj/ansj_seg/5.1.6'
jars_dir_nlp_lang = 'D:/software/IDEA/tools/maven_soft/org/nlpcn/nlp-lang/1.7.7'
jars_dir_tree_split = 'D:/software/IDEA/tools/maven_soft/org/ansj/tree_split/1.5'
jars = [os.path.join(jars_dir_ansj_seg, 'ansj_seg-5.1.6.jar'), os.path.join(jars_dir_nlp_lang, 'nlp-lang-1.7.7.jar'), os.path.join(jars_dir_tree_split, 'tree_split-1.5.jar')]
jvm_cp = "-Djava.class.path={}".format(':'.join(jars))
jpype.startJVM(jvmPath, "-ea", jvm_cp)
SegModel = jpype.JClass('org.ansj.splitWord.analysis.ToAnalysis')
jd = SegModel()
print(jd.parseStr("怎么这么麻烦"))
jpype.shutdownJVM()

报错:
Connected to pydev debugger (build 172.4574.37)
D:/software/Java/Java8/jre/bin/server/jvm.dll
Traceback (most recent call last):
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev\pydevd.py", line 1599, in
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev\pydevd.py", line 1026, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:/workspace/python/django_server/nlp_app/segment/ansj_seg_Jpype.py", line 18, in
SegModel = jpype.JClass('org.ansj.splitWord.analysis.ToAnalysis')
File "D:\software\Anaconda3\envs\py36\lib\site-packages\jpype_jclass.py", line 55, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.RuntimeExceptionPyRaisable: java.lang.RuntimeException: Class org.ansj.splitWord.analysis.ToAnalysis not found

@yongzhuo
Copy link

这么弄,报错,求助:
import jpype
import os

jvmPath = 'D:/software/Java/Java8/jre/bin/server/jvm.dll'
print (jvmPath)
jars_dir_ansj_seg = 'D:/software/IDEA/tools/maven_soft/org/ansj/ansj_seg/5.1.6'
jars_dir_nlp_lang = 'D:/software/IDEA/tools/maven_soft/org/nlpcn/nlp-lang/1.7.7'
jars_dir_tree_split = 'D:/software/IDEA/tools/maven_soft/org/ansj/tree_split/1.5'
jars = [os.path.join(jars_dir_ansj_seg, 'ansj_seg-5.1.6.jar'), os.path.join(jars_dir_nlp_lang, 'nlp-lang-1.7.7.jar'), os.path.join(jars_dir_tree_split, 'tree_split-1.5.jar')]
jvm_cp = "-Djava.class.path={}".format(':'.join(jars))
jpype.startJVM(jvmPath, "-ea", jvm_cp)
SegModel = jpype.JClass('org.ansj.splitWord.analysis.ToAnalysis')
jd = SegModel()
print(jd.parseStr("怎么这么麻烦"))
jpype.shutdownJVM()

报错:
Connected to pydev debugger (build 172.4574.37)
D:/software/Java/Java8/jre/bin/server/jvm.dll
Traceback (most recent call last):
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev\pydevd.py", line 1599, in
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev\pydevd.py", line 1026, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\software\pycharm\PyCharm 2017.2.7\helpers\pydev_pydev_imps_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:/workspace/python/django_server/nlp_app/segment/ansj_seg_Jpype.py", line 18, in
SegModel = jpype.JClass('org.ansj.splitWord.analysis.ToAnalysis')
File "D:\software\Anaconda3\envs\py36\lib\site-packages\jpype_jclass.py", line 55, in JClass
raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
jpype._jexception.RuntimeExceptionPyRaisable: java.lang.RuntimeException: Class org.ansj.splitWord.analysis.ToAnalysis not found

已解决:
将jvm_cp = "-Djava.class.path={}".format(':'.join(jars))中的冒号转为分号就可以了jvm_cp = "-Djava.class.path={}".format(';'.join(jars))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants