我在这里面临一个问题。我需要创建一个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
下答案 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>