2017-09-26 18 views
1

json形式を使用してホスト名を表示するspring IOフレームワークを使用して作成されたアプリケーションで作業しています。サービスとして起動すると、Javaアプリケーションが正常に動作しない

それはコマンドでコマンドラインから起動されたときに、アプリケーションが正常に動作している

java -jar spring-cd.jar 

必要な出力できます:

enter image description here

を、それは次のように実行されるときsystemdユニットファイルを使用したサービスreuqired出力(ホスト名)null:

enter image description here

ユニットファイルのコードは以下の通りです:

[Unit] 
After=network.target 

[Service] 
ExecStart=/usr/bin/java -jar /opt/training/spring-cd/spring-cd.jar 
Type=simple 
User=root 
Restart=always 

[Install] 
WantedBy=default.target 

私はそれらのアプローチや、なぜ第二ディスプレイ「ヌル」の違いは何であるか理解していません。また、私はかなり新しく、systemdとlinuxです。

関連するJavaコード:

import java.lang.System; 

public class Greeting { 
    private final String content; 

    public Greeting() { 
     this.content = getHostname(); 
    } 

    private String getHostname(){ 
     String hostname; 
     if (System.getProperty("os.name").startsWith("Windows")) { 
      hostname = System.getenv("COMPUTERNAME"); 
     } else { 
      hostname = System.getenv("HOSTNAME"); 
     } 
     return hostname; 
    } 

    public String getContent() { 
     return content; 
    } 
} 
+0

あなたは関連するJavaを投稿することができますホスト名を読み取るコード? – randomir

+0

私は投稿を編集し、Javaコード – MiM1

+0

を含むgithubリポジトリへのリンクを追加しました。環境変数が異なる可能性があります。 – hailinzeng

答えて

1

にsystemdによって実行時にin your codeを使用HOSTNAME環境変数は、Javaプログラムの環境では使用できません。ユニット構成は、ロードされた時点で実行中のシステムの

[Service] 
... 
Environment=HOSTNAME=%H 

%H指定stands for the hostname

簡単な修正は[Service]セクションの下に、あなたのサービス単位のファイルに直接欠落している環境変数を追加することです。

代わりに(代わりにEnvironmentディレクティブで各変数を定義する)は、ファイル内のすべての変数を入れて、EnvironmentFileディレクティブを使用、またはPassEnvironmentディレクティブで変数の選択を渡すことができます。しかし


、は、標準のJavaクラスを使用することですよりポータブルな方法java.net.InetAddressgetHostName()方法:

hostname = InetAddress.getLocalHost().getHostName(); 

this answerで説明したように)

+1

ありがとうございます、環境変数を追加しました。 – MiM1

+0

よろしくお願いします!私は、JavaがWindowsとLinuxの両方で適切なホスト名を見つけ出すことに気を配るよりポータブルなアプローチを試みることをお勧めします。コードとそのメンテナンスを簡素化することができます。 – randomir

関連する問題