2017-08-25 9 views
0

私はSpringを使用しています(Spring-Bootなし)。私は、デフォルト設定(とapplication.propertiesリソースフォルダ内)または-Dconfig.folder=/path/to/custom/external/directorylogback.xmlapplication.properties/path/to/custom/external /ディレクトリ)で実行できるスタンドアロンアプリケーションをビルドしたいと考えています。アプリケーションを-Dconfig.folderパラメータAppConfigで実行すると、ログバックとプロパティの両方が外部ディレクトリからロードされます。プロパティの外部化とログバックSpring

外部フォルダをリソースフォルダのように動作させる方法はありますか。

そうでない場合は、これに共通する解決策は何ですか?

私の現在の実装(使用して、デフォルトのリソースフォルダのみ):

App.java

public class App { 

    public static void main(String[] args) { 
     ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 

     SampleAction p = context.getBean(SampleAction.class); 
     p.performTask(); 
    } 
} 

AppConfig.java

@ComponentScan 
@PropertySource("classpath:application.properties") 
class AppConfig { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

SampleAction.java

@Component 
public class SampleAction { 
    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @Value("${sample.prop}") 
    private String sampleProp; 

    public void performTask(){ 
     logger.debug(sampleProp); 
    } 
} 

logback.xmlapplication.propertiesのlog4j.xml

-Dlog4j.configuration=C:\neon\log4j.xmlについて問題

+0

が、私は十分あなたの質問に答えるましたか?はいの場合は、それを受け入れてください。そうでない場合は、私がその答えを改善できる理由を説明してください。 –

+0

基本的には、JavaコードInputStreamの設定を入れて、ログバック設定をできるだけ早くできるようにしていません。 – ilovkatie

+0

私の編集を参照してください。あなたが春のことを知らないなら、まず宿題をする必要があります。私たちはあなたが特定の問題を抱えているときにあなたを助けようとしますが、私たちはあなたの仕事をしません。 –

答えて

1

は、示唆しますの場合は、デフォルトのapplication.propertiesをjarファイルから読み込むことができないため、あなたは嫌です。あなたがすべきことは以下の通りです:

@PropertySource("${config.folder:'classpath:'}/application.properties") 
public class AppConfig 

logback.xmlについて:

@Value("${config.folder}:") 
private String configFolder; 

InputStream = Optional.of(new ClassPathResource(configFolder + "/logback.xml")) 
    .filter(r -> r.exists()) 
    .orElse(new ClassPathResource("classpath:/logback.xml")) 
    .getInputStream(); 

をどちらの場合も、私はデフォルトのパッケージファイルの上にコマンドライン引数を優先しました。もちろん、私は上記をコンパイルしていないので、タイプミスやマイナーなエラーがあるかもしれませんが、あなたはそのアイデアを得ます。

編集

OPは上記のコードを実行する場所を理解していないと主張しているので

-

public class AppConfig { 
    @PostConstruct 
    void init() { 
     // init logback here 
    } 
} 
+0

私はこのログバックの設定をどこに置くべきなのでしょうか?1.正しいログオプションを使用してください。2.アプリケーションをスプリットロジックと設定の面で清潔に保ちます。どんなアドバイスですか? – ilovkatie

+0

@ilovkatie 'src/main/resources' –

+0

私はInputStreamのログバック設定を意味しました:> – ilovkatie

0

に関連しないVM引数

としてmain()メソッドの場合:

String filename = System.getProperty("log4j.configuration"); 
DOMConfigurator.configure(filename); 
外部プロパティについては

ファイル:

-Dext.prop.dir=C:\neonをVM引数としてあなたのAppConfigクラスの

変更は以下のようにVM引数を持つ

@PropertySource("file:///${ext.prop.dir}/application.properties") 
public class AppConfig{ 
} 

ランのAppクラスのようになり、両方のファイルが外部の場所から使用されますあなたはにfile接頭辞を使用する場合は、他の回答とは異なり

-Dlog4j.configuration=C:\neon\log4j.xml -Dext.prop.dir=C:\neon 
関連する問題