Java中Web Project如何加载dll/DLL文件[亲测有效]

Java中Web Project如何加载dll/DLL文件[亲测有效]基本上常用的项目有两种,一种是Java Project,另一种是Web Project,下面就以这两种项目为例,来阐释如何在项目中加载dll文件。 由JDK的说明文档可知,load()方法接收的是绝对路径。 由JDK的说明文档可知,loadLibrary()方法不接收任何平台相…

基本上常用的项目有两种,一种是Java Project,另一种是Web Project,下面就以这两种项目为例,来阐释如何在项目中加载dll文件。

Java中调用dll的方式

  • System.load()
  /** *Loads the native library specified by the filename argument. The filename argument must be an absolute path name. */

    public static void load(String filename)

    //等价于

    Runtime.getRuntime().load(name)

由JDK的说明文档可知,load()方法接收的是绝对路径。

  • System.loadLibrary()
  /** Loads the native library specified by the libname argument. The libname argument must not contain any platform specific prefix, file extension or path. */

    public static void loadLibrary(String libname)

    //等价于

    Runtime.getRuntime().loadLibrary(name)

由JDK的说明文档可知,loadLibrary()方法不接收任何平台相关的特定前缀、文件扩展名或者路径。该方法会自动搜索一些固定路径,我们只需要把dll文件放入Path(系统的环境变量)路径下或者System32路径下,也可以直接放在Java项目的根目录下。以上几种方法都可以成功加载。

Java Project

如果是Java Project,只要把dll文件放在Path或者System32或者项目根目录下,基本上都可以正确的加载到dll文件。

Web Project

根据2014年最流行的应用服务器的统计结果,41%的应用服务器部署的是Tomcat,其中出乎我意料的是Jetty以31%的份额占据了第二把交椅,那就以最常用的Tomcat为例吧。

如果使用load()方法加载dll文件,那么代码应该这么写

String path = DBUtils.class.getResource("/").getPath();

path = path.replaceAll("%20", " ");//排除中文空格

System.load(path + "user.dll");

如果使用loadLibrary()方法加载dll文件,简单的如上处理已经不能解决问题了,这是因为Web项目中,将 java.library.path 这个系统属性输出了一下,结果出来两个路径:

  • %JAVA_HOME%/bin
  • %TOMCAT_HOME%/bin

当然了其实还应该包括一个路径就是

  • %JRE_HOME%/bin

所以这时候,在Windows上的Web Project系统至少有三个地方可以放置我们的dll文件,你可以任取其一即可。对于JAVA_HOMEJRE_HOME,只要放入它们对应的bin目录下即可,但是TOMCAT_HOME就稍微复杂一点,一定要记住把dll文件放在和启动Tomcat的文件同一目录中,一般来说,放入tomcat的bin目录下即可,这是因为启动tomcat的命令startup.bat就在bin目录下,但是如果启动tomcat的命令不在tomcat的bin目录下,dll文件就应该放在启动tomcat的命令所在的目录。

也许有人说,难道有的tomcat的启动命令不是在bin目录下,是的,maybe就真的存在,比如在Eclipse中配置tomcat(免安装的tomcat版本),然后在Eclipse中启动tomcat,这时候,仅仅简单的将dll文件放在tomcat/bin/目录下是行不通的,大家可以测试一下。本人测试在JAVA_HOME的bin目录中是完全没问题的,但是这样的话当项目越来越多,dll文件越来越多,就很难区分开哪些dll文件是属于哪些项目的了。

路径测试

环境是编译完成的本地LTP动态链接库,这些链接库可能还会加载LTP训练好的一些model-模型文件,所以作为测试不太合适,因为受model不定因素影响,但是可以借鉴一下。

  • 在Eclipse中配置的Tomcat情况下,当在类中使用System.loadLibrary(“ner_jni”);方法时

将dll文件放在WEB-INF/lib/下面找不到dll文件 将dll文件放在Tomcat/bin/目录下面找不到dll文件 将dll文件放在Web Project的src目录下面找不到dll文件

  • 当在类中使用
 String str = NER.class.getResource("/").getPath();

 str = str.replaceAll("%20", "");

 System.load(str + "ner_jni.dll");

方式时,并将dll文件放在Web Project的src目录下会出现

[java.lang.UnsatisfiedLinkError: D:\devSoft\apache-tomcat-7.0.52\webapps\DaseLab\WEB-INF\classes\segmentor_jni.dll: Can’t find dependent libraries]

这已经不是找不到dll文件的问题了,而是找不到依赖库,说明这种方式或许是可以加载到dll文件的,但是加载dll文件的顺序不正确,先加载的dll文件可能会依赖于后加载的dll文件,所以这种方式,一定要注意加载dll文件的顺序。解决办法可以参见【4】中的资料。

  • 使用loadLibrary()方法时,将dll文件放在Java安装目录的bin/下,这种方式肯定可以加载到dll文件,但是可能会出现

Classloader, XXX.dll already loaded in another classloader

参考文献

[1] www.cnblogs.com/zfc2201/arc… [2] www.programgo.com/article/411… [3] blog.csdn.net/zhyh1986/ar… [4] www.111cn.net/jsp/Java/41…

转自 www.codepub.cn/2015/05/19/…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13654.html

(0)

相关推荐

  • mysql in查询语句_sql where in 子查询

    mysql in查询语句_sql where in 子查询经常在网上看到 “IN” 子句用不到索引,或者 “IN” 后面的字段用不到索引,这里做个简单的测试。 步骤如下: 一、准备资料 1.表定义 商品表:t_order ID 商家ID(int) 店铺ID…

    2023-03-06
    152
  • Python中使用key in dict对字典进行查找和判断

    Python中使用key in dict对字典进行查找和判断a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-03-12
    90
  • Redis-nosql应用场景[通俗易懂]

    Redis-nosql应用场景[通俗易懂]
    》演变过程 》数据的获取不单单单单是从mysql等关系型数据库中获取了 》商品的基本信息 》商品的评价,描述等 》商品的图片 》商品的波段性的热点高频信息 …

    2023-04-04
    174
  • Mybatis官方文档解读「终于解决」

    Mybatis官方文档解读「终于解决」作用域(Scope)和生命周期 理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。 SqlSessionFactoryBuilder 这个类可以被实例…

    2023-02-09
    164
  • Doris开发手记3:利用CoreDump文件快速定位Doris的查询问题「终于解决」

    Doris开发手记3:利用CoreDump文件快速定位Doris的查询问题「终于解决」Apache Doris的BE部分是由C++编写,当出现一些内存越界,非法访问的问题时会导致BE进程的Crash。这部分的问题常常较难排查,同时也很难快速定位到对应的触发SQL,给使用者带来较大的困扰

    2023-04-18
    150
  • IntelliJ Idea 2020.1 正式发布,官方支持中文了「建议收藏」

    IntelliJ Idea 2020.1 正式发布,官方支持中文了「建议收藏」1. 前言 今天 IntelliJ Idea 2020.1 正式发布了!最大的一个亮点莫过于开始支持中文了。相信很多英语不好的同学已经期盼已久了。但是感觉登录界面感觉变丑了!建议把文章看完再去升级。 2. 汉化体验 我大致看了一圈,个别还没有汉化完毕,可能没有找到合适的描述词汇…

    2023-03-24
    309
  • 基于PyCharm的Python工程师技能培养

    基于PyCharm的Python工程师技能培养在当今的技术发展中,Python已经成为了非常重要的一门编程语言。同时,Python的灵活性、易学性、可读性等特点也使得它成为了广大编程爱好者和工程师的首选编程语言之一。而作为Python环境中的一款非常受欢迎的编辑器,PyCharm不仅有着强大的功能和工具,还能够帮助程序员更高效地编写代码、debug、协同工作等。因此,基于PyCharm的Python工程师技能培养也成为了大众关注的一个重要话题。

    2024-07-19
    39
  • Python实现十六进制转换功能

    Python实现十六进制转换功能计算机中使用二进制进行存储与计算,但二进制表示起来较为麻烦。于是十六进制作为另一种进制存在,常用于表示二进制数据和颜色值等。在Python中,通过内置函数或是自编函数可以实现十六进制与其他进制的转换,这为计算机科学领域的数据交换及处理提供了便利。

    2024-07-09
    48

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注