如何将spring配置文件作为输入流传递到ClassPathXmlApplicationContext中

时间:2014-04-09 06:50:52

标签: java xml eclipse spring command-prompt

我在这里面临一个问题。我需要创建一个spring批处理项目的jar文件。我从eclipse将项目导出为可运行的jar,但是当我尝试使用命令提示符来命令jar时,它无法找到jar中的config xml文件。我想出的工作是将配置文件复制到我有jar的同一个文件夹中,但绝对是不可取的。 当我在eclupse中运行应用程序作为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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为除非您愿意,否则无需外部化xml文件。 但是因为它在/ resources路径下并且我猜你使用Maven然后它会自动将该jar放入ClassPath。你无需明确地做到这一点。

现在假设您想在其他xml文件中使用它来从中获取bean,您只需将其导入其他xml

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

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

答案 2 :(得分:0)

你有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>