【问题标题】:How to pass spring config file as inputstream into the ClassPathXmlApplicationContext如何将 spring 配置文件作为输入流传递到 ClassPathXmlApplicationContext
【发布时间】:2014-04-09 06:50:51
【问题描述】:

我在这里遇到了一个问题。我需要创建一个spring批处理项目的jar文件。我从 Eclipse 将项目导出为可运行的 jar,但是当我尝试使用命令提示符运行 jar 时,它无法找到 jar 中的配置 xml 文件。我想出的解决方法是将配置文件复制到我拥有 jar 的同一文件夹中,但这绝对是不可取的。 当我在 eclipse 中将应用程序作为 java 应用程序运行时,它可以工作,但当我将应用程序转换为 jar 并从命令提示符运行它时,它不能工作。

这是我的主要课程:

public class RunApp {
public static void main(String[] args) {

    String[] springConfig = { "hello-job.xml" };

    ApplicationContext context = new ClassPathXmlApplicationContext(
            springConfig);

    JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    Job job = (Job) context.getBean("helloJob");

    try {

        JobExecution execution = jobLauncher.run(job, new JobParameters());
        System.out.println("Exit Status : " + execution.getStatus());

    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        ((AbstractApplicationContext)context).close();
    }

    System.out.println("Done");

}
}

我需要一个解决方案,我可以将 ClassPathXmlApplicationContext 中的“hello-job.xml”文件作为流传递,或者以任何方式从形成的 jar 中访问我的 xml 文件。

我的 hello-job.xml 位于 src/main/resources/hello-job.xml 下

【问题讨论】:

  • 您的hello-job.xml 是否存在于您生成的 JAR 文件中?
  • 也可以试试:new ClassPathXmlApplicationContext(new String[]{"classpath*:hello-job.xml"});
  • 是的,当我使用 winzip 解压我的 jar 时,我可以在 jar 中看到所需的 xml,我的代码仍然找不到从命令提示符运行代码的 jar..
  • 它可以从 Eclipse 运行,我已将它添加到我的类路径中:( org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: 从类路径资源加载 XML bean 定义 [hello-job. xml] 线程“main”中的异常 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 原因:java.io.FileNotFoundException:类路径资源 [hello-job.xml] 无法打开,因为它不存在

标签: java xml eclipse spring command-prompt


【解决方案1】:

你有 3 种可能性。 在所有三种情况下,您都可以将 hello-job.xml 文件保存在 src/main/resources 文件夹中。我将从更简单的变体开始:

1。在使用 Maven 进行依赖管理的条件下,只需为 maven-assembly-plugin 添加一个配置,在其中指定主类 + 以包含依赖项在最终的可执行 jar 中。当您运行 mvn clean package 时,它将构建一个可执行 jar,您可以在其上运行 java -jar myjar-jar-with-dependencies.jar ,不管你把那个罐子放在哪里。

以下是需要添加到 pom.xml 文件中的插件的配置:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.mypackage.RunApp</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2 您必须在您的 src/main/resources/META-INF 目录中创建一个 MANIFEST.MF 文件,在其中通过添加 Main-Class 行来指定主类: com.mypackage.RunApp (注意你必须在你写的每一行之后插入一个换行符)。

在你构建你的包之后,你必须把那个可执行的 jar 放到你所有依赖项所在的目录中。

3 这类似于第二个变体(您还必须将打包的 jar 放在与依赖项相同的目录中),不同之处在于您告诉 Maven 构建您的 MANIFEST.MF 文件.这也可以通过配置插件来完成:

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.mypackage.RunApp</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

【讨论】:

  • 感谢大家的回复,我可以通过使用 maven jar、依赖项和程序集插件解决我的问题 :)
  • 酷,别忘了把它设为正确答案:)
【解决方案2】:

当您运行独立代码时,您的类路径中似乎不存在 XML。请尝试在命令提示符中设置类路径,然后运行该类。 链接如何设置类路径http://docs.oracle.com/javase/tutorial/essential/environment/paths.html 高温

【讨论】:

    【解决方案3】:

    我认为除非您愿意,否则您无需将 xml 文件外部化。 但由于它在 /resources 路径下,我猜你使用 Maven,那么它会自动将该 jar 放入 ClassPath。你不需要明确地这样做。

    现在假设你想在你的其他 xml 文件中使用它来从中获取 bean,你必须将它导入到你的其他 xml 中

    <import resource="classpath:/config/hello-job.xml" />
    

    当你运行你的 jar 时,它会自动被你的代码拾取

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2019-10-06
      • 2018-06-03
      • 2018-09-26
      相关资源
      最近更新 更多