需求是这样的,假设你的Java程序启动的时候要读一份配置文件,或者一个dll链接库,或者一个jar包,假设是dll好了,那么你的dll到底应该放在哪比较合适?
1.代码中使用绝对地址,这个是最好理解的,在代码中写好了绝对地址,那么程序肯定能找得到,缺点是当你的程序移植到了新的电脑上,那么这个绝对地址很有可能就失效了。

2.使用相对地址,这个就比较人性化了,也是常用的方式,使用相对地址前,首先要搞清楚的是相对地址是相对于谁的地址。我总结了三种情况。

  1. 相对于某个class文件的地址
  2. 相对于classpath路径地址
  3. 相对于当前工作目录地址

首先是第一种,相对于class文件的地址,一般来讲我们使用的是哪个class文件调用了这个dll,那么这个dll就是相对与这个class文件的地址。比如文件A.java里边调用了dll文件。那么A.java应该写的是:
path=this.class.getResource("").getPath() 或者path=A.class.getResource("").getPath()
load.(path+"\你的dll文件名.dll")
需要注意的是load()方法中你的文件名是要加上后缀的,loadlibrary()方法里边的文件名不加后缀。而且要使用双反斜杠“\",因为第一个"“是转义字符。当你的代码放在一个静态函数里边时,是不能用this的,但是可以使用A.class。
这样的话你的dll文件跟A.class文件放在一块再运行,程序运行就不会出错了,放在一块也就是放在同一个目录下,注意是和A.class文件在同一个目录,不是A.java源文件。也就是说你在编译完成后,找到A.class文件所在的位置,把dll文件放到它旁边就可以了。
如果你在A.java中导入了B类,而且你把path=A.class.getResource(”").getPath()换成了path=B.class.getResource("").getPath(),那么你就得把dll文件放在和B.class同一目录。
这里解释一下A.class.getResource("")的意思,getResouce()是获取资源的意思,完整用法为A.class.getResource(“xxx”),意思是获取和A.class同一文件下的某个资源xxx,这个xxx资源可以是一个txt文件,比如”name.txt",得到这个”name.txt"的资源对象。那么上边为什么没有参数呢,当“xxx"为空时,表示获取一个空对象,获取空对象当然没有什么用,但是可以通过这个方式获取A.class文件的地址,就像上边写的那样。

第二种就是相对于classpath类路径的地址了,首先我们先对类路径达成共识,假设你的类A.java。放在包com.gg.yy下,而这个包放在DIRR文件夹下,那么这个DIRR文件夹的路径应该被你或者你的编辑软件设为类路径,java编译器只有先知道类路径,才能正确找到com.gg.yy这个包,也才能找到A.java来进行编译。所以A.java所在的目录结构为 “类路径/com/gg/yy/A.java”,如果想要dll文件放在类路径下,也就是DIRR目录下,也就是和com目录待一块。
获取类路径的方式为:

  1. 通过类加载器,类加载器肯定是通过类路径来寻找和加载类的,path=Thread.currentThread().getContextClassLoader().getResource("").getPath(),或者path=A.class.getClassLoader().getResource("").getPath()
  2. 通过这个类A,因为类A所属的包也是放在类路径下,所以也可以这么写:path=A.class.getResource("").getPath(”/“),比第一种写法只多了”/“。
    只样的话你的dll文件就得放在类路径下了。
    值得注意的是类路径不止有一个,可以有很多个,以上的类路径我指的是类A的类路径。如果有一个类B,它可以不用放在目录DIRR下,比如放在目录DIRT下,那么就得把DIRT添加到类路径,这样编译器和虚拟机才能找得到类B。我们在设置系统变量时通常也会配classpath类路径,这个类路径指的是我们安装java的目录中jre下的jar包,jar包是一些经过压缩的class类,有了这些类,我们的java程序才能运行的起来,我们只有把这些class类添加到类路径中,虚拟机才能找到这些类。虚拟机会找遍所有的类路径,通过这些类路径找到所有的java文件。

第三中,那就是相对于当前的工作地址了,写法为path =System.getProperty(“user.dir”),System.getProperty(“user.dir”)按字面上理解就是系统.属性(工作目录),也就是获取操作系统当前的工作目录了。通过System.getProperty()我们可以获取系统的很多参数信息,比如java安装地址,操作系统的名称等等,当参数为user.dar时,意思就是系统当前的工作目录,值得注意的是,工作目录是针对某一个进程而言的,进程qq的工作目录和进程wechat的工作目录是不一样的,那么你可能会想,我安装了qq,安装的文件夹下哪一个才是工作目录呢,是最上边那个吗?其实不一定的。我在桌面打开了qq,那么桌面就是qq当前这个进程的工作目录,我在d盘下的test目录下打开了qq,这个test目录就是当前这个qq进程的工作目录。如何在test目录打开qq?打开cmd,切换到test目录,然后输入qq应用程序的地址,然后回车就可以了。
所以要是你在程序中使用了工作目录,而且你从这个工作目录中加载你的dll,那么你只有在这个指定的目录中打开你的应用程序,你的dll才会被加载到!
使用工作目录这个方法看起来没有用,但是如果的java使用ext4j进行打包成exe,那么你得指定exe4j是不处理dll文件的,通过jar包生成exe时他会跳过dll文件,这样如果的你使用相对类路径或者类加载的dll,你的dll放在打包生成jar包中,那么平常运行jar包的时候,dll是可以被加载到的,但是一旦使用exe4j给这个jar包打包,那么dll就不会被打包上了!也就是说打包后的程序就加载不到dll了。使用工作目录,可以指定dll文件和jar包放在同一级目录,打成exe后,和exe放在同一级目录。
当然也可以先获取类路径,然后获取类路径的上一级目录,上一级目录的上一级目录。。。这种方式 …/…/…/

exe4j打包的时候记得根据你的jre位数指定32为还是64位。

还有一个遇到的问题,就是你的dll引用了另外一个dll,那么这个另外引用的dll应该放在哪?
答:放在工作目录!或者是C:\Windows\System32,这个目录比较保险,系统的dll大多放在这个目录,程序运行的时候会扫描这个目录,还有一个目录,C:\Windows\SysWOW64,是C:\Windows\System32的兄弟,内容是差不多的,C:\Windows\System32里边放的是32位的dll,C:\Windows\SysWOW64里边放的是64位的dll。当放在C:\Windows\System32不管用的时候,放在C:\Windows\SysWOW64试试看!不知道java的bin目录下可不可以。

Java中关于路径和使用exe4j打包成ext可执行程序的一些小总结相关推荐

  1. java 文件路径读取,java中依据路径读取文件

    java中根据路径读取文件 根据文件路径读取文件.具体代码如下: /** * 根据文件路径读取文件 * @param path * @return String * @throws IOExcepti ...

  2. Java中JVM的xmx和xms配置成一样的好处

    Java中JVM的-Xmx和-Xms配置成一样有什么好处 文章目录 Java中JVM的-Xmx和-Xms配置成一样有什么好处 一.`-Xmx`和`-Xms` 二.设置`-Xmx` 的注意点 三.-Xm ...

  3. 知识付费系统源码,可直接打包成app、H5、小程序

    知识付费,在近几年来,越来越受到大家的关注.知识付费系统源码是将知识通过互联网渠道变现的方式.以知识为载体,通过付费获得在线知识以及在线学习所带来的收益.知识付费平台主要以分享知识内容,内容分为直播. ...

  4. 【Java】Java GUI制作Windows桌面程序,利用windowbuilder生成界面,使用exe4j打包成可执行文件,使用Inno Setup打包成安装包,超级详细教程

    目录 1.GUI插件 1.1 下载GUI绘制插件 1.2 eclipse中配置windowbuilder插件 2.绘制GUI界面 2.1 建立一个GUI的项目 3.配置Maven项目 3.1新建一个M ...

  5. java中相对路径怎么写_java中如何使用相对路径读取文件

    java中使用相对路径读取文件的方法:1.使用文件[File file = new File("src/test.txt")]方法:2.使用类的相对路径:3.使用当前线程的类加载器 ...

  6. Java中获取路径的各种方法

    2019独角兽企业重金招聘Python工程师标准>>> 1. java文件中获得路径 Thread.currentThread().getContextClassLoader().g ...

  7. Java 中访问路径的问题

    在Java中路径分为绝对路径和相对路径 访问路径 通常访问路径也就是URL,统一资源定位符,URL由两部分组成资源路径和资源名称 资源名称也就是你要访问的路径,就比如我的image,我的image是访 ...

  8. Java中文件路径的写法

    2019独角兽企业重金招聘Python工程师标准>>> 在Java中如果按照正常的文件路径来表示文件名,那么Java将不能够识别,比如D:\Java等,正确的写法应该是将" ...

  9. Java中的路径:IPath与IFile

    在构建IFile时,传入了这样一个参数, E:/runtime-EclipseApplication/hellome/deployed 发现IFile可以识别这个路径. 在路径名中,目录与目录.目录与 ...

最新文章

  1. 针对$_SERVER[’PHP_SELF’]的跨站脚本攻击(XSS)
  2. 手动删除3389连接记录
  3. MySQL学习第四章课后题
  4. SpringMVC获取Request,Response, Session对象
  5. Sql Server 在数据库中所有表所有栏位 找出匹配某个值的脚本(转)
  6. springboot2.0集成activiti modeler
  7. 【Flink】 Flink JobManager HA 机制的扩展与实现
  8. MySQL to Hbase 数据的抽取
  9. pingback协议与traceback协议的区别
  10. jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!)
  11. java 数字转中文_使用Java将阿拉伯数字转换为中文数字(适配小数转换)
  12. java publish_java – 如何正确使用SwingWorker上的publish()和process()方法?
  13. 请控制好你的情绪--职场情绪管理
  14. 读源码(四)—— js Promise
  15. 记录TPTP监控tomcat
  16. js处理请求最多的服务器,vue.js 请求服务器
  17. 60种数据可视化图表总结
  18. c语言中1代表true嘛,c++中-1是true呢还是false呢
  19. java用数组输出fibo_[Java教程]养兔子Fibo函数优化
  20. bugku-细心(想办法变成admin)

热门文章

  1. T-SQL自定义函数返回前一天或后一天日期
  2. 国产微服务网关Apache APISIX安装
  3. 如何有效利用SD-WAN改善网络性能?
  4. 【指标统计】统计装置总招遥信
  5. 在SLES-11-SP1-i586上搭建apache+php环境
  6. redux VS mobx (装饰器配合使用)
  7. 环境变量设置及第三方模块安装
  8. shopnc 发票项目
  9. easyui使用datagrid时列名包含特殊字符导致表头与数据错位的问题
  10. WPF 文本呈现(2)