当前位置: 首页 > 知识库问答 >
问题:

可运行的jar如何在运行时加载外部xml文件?

蔺翰音
2023-03-14

(这似乎是一个微不足道的问题,但卡住了2天:()

我有一个可运行的jar(用maven程序集插件创建)。jar中的一个类在类路径上查找xml文件。但是,我们不想在jar中捆绑xml文件,并希望它被外部化。

尝试到现在:

>

  • 在运行时设置类路径:

    java -classpath ./conf -jar my-jar-with-dependencies.jar
    

    ==

    在汇编插件中设置类路径

            <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.xxx.Test</mainClass>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>./conf/</classpathPrefix>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    

    ==

    编辑:

    已生成MAINFEST。MF在罐子里:

    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Created-By: Apache Maven
    Built-By: xxx
    Build-Jdk: 1.7.0_21
    Main-Class: com.xxx.Test
    

    编辑2:

    所以我在jar中编辑了生成的清单,并重新创建了jar。还是找不到xml!

    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Created-By: Apache Maven
    Built-By: xxx
    Build-Jdk: 1.7.0_21
    Main-Class: com.xxx.Test
    Class-Path: . /* Tried with both . and ./conf */
    
  • 共有2个答案

    计泉
    2023-03-14

    似乎没有一个好的答案。总之:

    • java-jar忽略-cp选项
    • ClassPath添加到manifset中也没有效果(不确定这是否是由于库加载xml的特定方式造成的)

    因此,剩下的唯一有效选项是手动调用类文件:

    $ java -cp <...> MyPackage.MyClass
    

    其中,cp包含jar文件和conf文件夹路径。

    通飞尘
    2023-03-14

    当您使用-jar参数时,您指定的类路径将被忽略

    使用此选项时,JAR文件是所有用户类的源,其他用户类路径设置将被忽略。

    JVM使用清单中指定的类路径。确保清单包含类路径定义。

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

    • 问题内容: 我试图在运行时将jar文件添加到classpath。我用这个代码 系统输出打印此URL: 我正在仔细检查此路径,此jar存在。即使这个测试也显示com.mysql.jdbc。驱动程序类存在。 但是,当我使用此Class.forName(driver)时,仍然会收到java.lang.ClassNotFoundException。此代码有什么问题? 问题答案: URL可以,但是您仍然尝试

    • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法一样容易的事情来说是很多工作。 对执行此操作的简单代码有何建议? 问题答案: 很难的原因是安全性。类加载器是不可变的。你不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。

    • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法那样容易的事情来说是很多工作。 问题答案: 很难的原因是安全性。类加载器是不可变的。您不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。这是制作自己的子类加载器的方法:

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

    • 我正在尝试制作一个Java工具,它将扫描Java应用程序的结构,并提供一些有意义的信息。要做到这一点,我需要能够扫描所有的。从项目位置(JAR/WAR或只是一个文件夹)初始化文件,并使用反射来阅读它们的方法。事实证明,这几乎是不可能的。 我可以找到许多基于URLClassloader的解决方案,它们允许我从目录/归档中加载特定的类,但没有一种解决方案允许我在不知道类名或包结构的情况下加载类。 编辑