当前位置: 首页 > 面试题库 >

相对于正在执行的jar文件加载文件

谢奇略
2023-03-14
问题内容

问题说明了一切。

在我的情况下,特殊之处在于当前工作目录不是jar文件的位置,而是c:\Windows\system32(我的jar文件由Windows使用右键菜单启动,我想将文件夹的路径作为参数传递给jar)

现在,我想加载一个config.xml与jar相同的文件夹中的配置文件。该文件的目的当然是为jar提供设置。对我来说重要的是,xml文件 位于
jar文件 之外 ,以便于编辑。

我很难加载该文件。Windows执行该行

cmd /k java -jar D:\pathToJarfile\unpacker-0.0.1-SNAPSHOT-jar-with-dependencies.jar

调用整个过程cmd /k会使Windows命令提示符保持打开状态,以便我可以看到jar的输出。

我不能使用new File(".")System.getProperty("user.dir")作为相对路径,因为这些函数分别返回C:\Windows\system32\.C:\Windows\system32(这是Windows执行AFAIK的所有内容的工作文件夹)。

我都没有成功Launcher.class.getResourceAsStream("/../config.xml")。由于该路径以开头/,因此搜索从jar的根节点开始。要../config.xml精确指向该文件,但调用返回null

有人可以指出我正确的方向吗?我真的被困在这里。每次加载此文件的确让我感到烦恼…

我自己的要求:

  • 我不想在Java源代码中对路径进行硬编码
  • 我不想将文件的路径作为参数传递给java -jar调用(既不作为的参数,main(String[] args)也不-Dpath=d:\...用于设置系统属性)

除了原始问题之外,在使用时,我还很难将maven2 Class-Path: .放入MANIFEST.MF(BalusC发布的解决方案)中jar- with-dependencies。问题是该行出现在常规jar的MANIFEST文件中,而不出现在jar-with-
dependencies.jar的MANIFEST文件中(生成了2个jar文件)。对于任何关心我如何做到的人:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
      <archive>
        <manifest>
          <mainClass>${mainClass}</mainClass>
          <addClasspath>true</addClasspath>
          <!--at first, i tried to place the Class-Path entry
              right here using <manifestEntries>. see below -->
        </manifest>
      </archive>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>attached</goal>
        </goals>
        <phase>package</phase>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>${mainClass}</mainClass>
            </manifest>
            <!--this is the correct placement -->
            <manifestEntries>
              <Class-Path>.</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </execution>
    </executions>
  </plugin>

问题答案:

要开始Launcher.class.getResourceAsStream("/../config.xml")工作,您需要将其路径添加Class- PathJAR MANIFEST.MF文件的条目中。这是正常的做法。



 类似资料:
  • 如何确认我的JAR文件已加载到Coldfusion中?我在CF10上。 我目前得到这个错误: 我的网站结构如下: 在我的申请中。cfc,我有以下代码: 这是我调用一切的代码: 更新#1 我在检查administor时发现了设置摘要,其中列出了服务器Java类路径。我添加了jar文件的位置并重新启动了服务器。即使路径存在于Administrator中的类路径中,我仍然会遇到相同的错误。 更新2 添加

  • jar是用“meta-inf”文件夹中的清单文件创建的。清单文件(为了查看目的删除了类路径中的一些jar条目): 文件夹结构: 我正在命令提示符下使用'java-jar application.jar mypkg.main'。 有人能告诉我是什么造成的错误和如何解决它吗?

  • 我有两个jar文件。第一个只包含接口 在请求的基础上,我试图从中加载我的实现类。jar文件存在于某个文件夹中,在运行时使用URLClassLoader。 课程正在加载 我确信这是由于我使用不同的类加载器来加载类,但是我如何克服类之间的兼容性问题。 同样的代码可以在正常的J2SE环境中工作,但不能在JBoss环境中工作。 如果我的查询不清楚,请让我知道我也可以粘贴源代码。

  • 我已经使用netbeans制作了jar文件,使用Build和Clean项目选项。我得到了.jar文件,现在当我执行它一小段时间后,cmd窗口出现,并给出一个错误:“Could not find or load main class while executing jar file” 但是,如果我使用命令提示符Java-jar执行jar,它可以正常工作 Netbeans的输出为: 而在jar文件中,

  • 问题内容: 你好堆栈溢出的朋友。我有一个简单的问题,我担心没有简单的解决方案,我需要有关如何进行的建议。我正在开发一个打包为可执行JAR的Java应用程序,但它需要在执行过程中修改其某些JAR文件内容。在此阶段,我遇到了问题,因为某些操作系统锁定了文件,从而阻止了对该文件的写入。 用户必须在应用程序退出时看到jar文件的更新版本,这一点非常重要,尽管我可以非常灵活地实现这一目标。干净,高效的解决方

  • 问题内容: 我被要求构建一个Java系统,该系统在运行时能够加载新代码(扩展)。我的代码运行时如何重新加载jar文件?或如何加载新的jar? 显然,由于持续的正常运行时间很重要,因此,我想增加在此过程中重新加载现有类的功能(如果这样做不会使事情复杂化)。 我应该注意什么?(将其视为两个不同的问题-一个关于在运行时重新加载类,另一个关于添加新类)。 问题答案: 用现有数据重新加载现有类可能会破坏事情