2014-12-02 4 views
2

Я полный новичок в Spring Batch Framework, и я нашел легко понятные коды от http://www.javabeat.net/introduction-to-spring-batch/ для использования в качестве учебных инструментов. Я мой проект создан в Eclipse, похож на коды со страницы, это выглядит следующим образом:Spring Batch CommandLineJobRunner не может найти конфигурационный файл .xml

Project Dir Structure

и код выполняет задания в fileWritingJob.xml с использованием CommandLineJobRunner как так:

package net.javabeat.articles.spring.batch.examples.filewriter; 

import org.springframework.batch.core.launch.support.CommandLineJobRunner; 

public class Main { 

    public static void main(String[] args) throws Exception { 

     CommandLineJobRunner.main(new String[]{"fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 
    } 
} 

, и он работает как ожидалось без проблем. Но когда я перемещаю fileWritingJob.xml в другой каталог (все еще под проектом dir), он не запускается. Я попытался изменить аргументы имени файла в методе CommandLineJobRunner, используя относительный и полный путь, но он все еще не работает. Например, если создать каталог в каталоге проекта (тот же уровень, как конфигурации) с именем задания и поставить XML там затем передать FilePath в CommandLineJobRunner так:

CommandLineJobRunner.main(new String[]{"/jobs/fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 

или это

CommandLineJobRunner.main(new String[]{"../jobs/fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 

это не работает.

Но когда я попытался создать подкаталог в директории конфигурации и поставить fileWritingJob.xml там, как этот

CommandLineJobRunner.main(new String[]{"configsubdir/fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 

он работает. Это как если CommandLineJobRunner проверяет только каталог config.

У меня заканчиваются идеи, может ли кто-нибудь мне помочь?

ОБНОВЛЕНИЕ: после небольшого поиска, благодаря предложению Майкла Минеллы о ClassPathXmlApplicationContext, я могу разместить xml везде, где захочу. Я также консультировался на эту страницу Spring cannot find bean xml configuration file when it does exist и http://www.mkyong.com/spring-batch/spring-batch-hello-world-example/

Так что я теперь объявить новый контекст, используя затем ClassPathXmlApplicationContextand запустить его с помощью задания запуска, вот как:

public static void main(String[] args) { 

    String[] springConfig = 
     { 
      "file:/path/to/xml/file" 
     }; 

    ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); 

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

    try { 

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

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Done"); 

    } 

Большое спасибо за все ваши входы!

ответ

1

Немного о том, что происходит, когда вы проходите путь к определению задания на основе xml на CommandLineJobRunner. Все, что мы делаем, это передать эту строку в конструктор ClassPathXmlApplicationContext. Из-за этого ожидается, что файл xml для определения задания будет находиться в пути к классам приложения.Я не могу сказать на экране вашего проекта, как вы строите проект, поэтому я не уверен, что каталог config находится в вашем пути к классу или нет. Однако, если он находится на пути к классам и живет в его основе, я ожидаю, что вы сможете передать путь к файлуWritingJob.xml как "/config/fileWritingJob.xml".

Источник этого класса может быть полезен при отладке этого типа проблемы. Вы можете найти исходный код для CommandLineJobRunner здесь: https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/CommandLineJobRunner.java

+0

, может быть, я был неясен. Он работает, если я помещаю xml в директорию config и его subdir. Он не работает, когда я перемещаю файл, а затем передаю путь к файлу CommandLineJobRunner. Я попробую проверить путь к классам, может быть, это даст мне подсказку. Спасибо за ваш совет! – akiortagem

0

Вы можете указать путь задания относительно вашего каталога config. Например, если fileWritingJob.xml в конфигурации/работы/каталог, то в вы можете выполнить работу следующим образом:

CommandLineJobRunner.main(new String[]{"jobs/fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 

Аналогично, если файл конфигурации задания находится за пределами конфигурации справочник, вы можете написать:

CommandLineJobRunner.main(new String[]{"../fileWritingJob.xml", "LayeredMultiThreadJobTest"}); 

Вы можете указать абсолютный путь для поиска задания.

+0

К сожалению, я упомянул, что он работает, если я положил его в поддире конфигурации правильно? Это не работает, если я выложу его из директории config, используя полный или относительный путь, но спасибо anyways – akiortagem

Смежные вопросы