Bir Üretim ortamında bir yay önyükleme yürütülebilir jar'ını nasıl çalıştırırım?


106

Spring boot'un tercih edilen dağıtım yöntemi, içinde tomcat içeren çalıştırılabilir bir jar dosyası yoluyladır.

Bir basit ile başlar java -jar myapp.jar.

Şimdi, bu jar'i EC2'deki linux sunucuma dağıtmak istiyorum, bir şey mi eksik yoksa uygulamayı bir arka plan programı olarak düzgün bir şekilde başlatmak için gerçekten bir init betiği oluşturmam gerekiyor mu?

Sadece java -jarararsam, oturumu kapattığımda uygulama ölür.

Ekranda veya nohup'ta başlatabilirdim, ancak bu çok zarif değil ve sunucumda yeniden başlatma beni oturum açmaya ve işlemi manuel olarak başlatmaya zorlayacak.

Öyleyse, ilkbahar botunda görev için zaten bir şey var mı?


2
nohup / screen (kirli yöntem), init / systemd / upstart (uygun yöntem)

@RC Evet, bildiğim kadarıyla, bahsettiğim gibi, / sbin / init /etc/init.d içinde özel bir betik ile iş görürdü, ama bu gerçekten herkesin daemon (başlat, durdur, yeniden başlat, durum)? Bu çözümde bir şey eksikmiş gibi geliyor.
Cleber Goncalves

Spring-boot'ta bir şeylerin eksik olduğunu hissediyorsunuz (bu gerçekten "taze" bir proje btw) sadece sorumlu ekiple iletişime geçin ve bir evrim önerisi yapın.

Bir savaş arşivi oluşturursanız, dağıtımınızın sürümünü kullanıma hazır bir başlangıç ​​betiğine sahip olan Tomcat üzerinde kullanabilirsiniz. Öte yandan, çalıştırılabilir jar yaklaşımını kullanırsanız, kendi özel init betiğinizi bulmanız gerekir. Bunun boot dünyasında olup olmadığından emin değilim, ama açıkça eksik, bu biraz garip, bu yüzden bir şeyi gözden kaçırmış olsam diye soruyorum. Onlara ping atacak.
Cleber Goncalves

1
Mevcut tartışma ve fikirler için buraya bakın .
Dave SYER

Yanıtlar:


97

Spring Boot 1.3.0.M1'den itibaren, Maven ve Gradle'ı kullanarak tamamen çalıştırılabilir kavanozlar oluşturabileceğinizi lütfen unutmayın.

Maven için şunları eklemeniz yeterlidir pom.xml:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

Gradle için aşağıdaki pasajı sayfanıza ekleyin build.gradle:

springBoot {
    executable = true
}

Tamamen çalıştırılabilir jar, dosyanın önünde fazladan bir komut dosyası içerir, bu da Spring Boot jar'ınızı init.dbir systemdkomut dosyasına sembolik bağlamanıza veya kullanmanıza olanak tanır .

init.d misal:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

Bu, uygulamanızı aşağıdaki gibi başlatmanıza, durdurmanıza ve yeniden başlatmanıza olanak tanır:

$/etc/init.d/yourapp start|stop|restart

Veya bir systemdkomut dosyası kullanın :

[Unit]
Description=yourapp
After=syslog.target

[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Aşağıdaki bağlantılarda daha fazla bilgi:


4
$ chmod +x /etc/init.d/yourappBaşlatma / durdurma / yeniden başlatma için de yapmanız gerekebilir
Rohith Nandakumar

Jar dosyasını okumak ve yürütmek için her zaman hizmet kullanıcınıza izinler vermeniz gerekir. Ayrıca, işlerin yürümesi için sunucu için varsayılan Java'yı ve Java ortamı değişkenlerini yapılandırmanız gerekir.
micaro

Bu çalışmıyor! Denedim ve aşağıdaki hatayı alıyorum: MyApp.service başlatılamadı: Unit MyApp.service not found
Martijn Hiemstra

9

Spring Boot uygulamalarını üretimde çalıştırmanın en kolay ve güvenilir yolu Docker kullanmaktır. Birden çok bağlı hizmet kullanmanız gerekiyorsa Docker Compose, Docker Swarm veya Kubernetes kullanın.

Başlamanız Dockerfileiçin resmi Spring Boot Docker kılavuzundan basit bir örnek :

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

Kapsayıcıyı arka plan programı olarak çalıştırmak için örnek bir komut satırı aşağıda verilmiştir:

docker run \
  -d --restart=always \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -p 8080:8080 \
  prefix/imagename

3

Spring boot uygulamamın iki başlatıcısı var. Biri geliştirme ve diğeri üretim için. Geliştirme için şu ana yöntemi kullanıyorum:

@SpringBootApplication
public class MyAppInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyAppInitializer .class, args);
    }

}

Üretim ortamı için Başlatıcım SpringBootServletInitializer'ı genişletir ve şuna benzer:

@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
    private static final Logger log = Logger
            .getLogger(SpringBootServletInitializer.class);
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        log.trace("Initializing the application");
        return builder.sources(MyAppInitializerServlet .class);
    }

}

Gradle kullanıyorum ve build.gradle dosyam ' WAR ' eklentisini uyguluyor . Bunu geliştirme ortamında çalıştırdığımda, bootrun görevini kullanıyorum. Onu üretime dağıtmak istediğimde , WAR'ı oluşturmak ve dağıtmak için assemble görevini kullanıyorum .

Geliştirme sırasında dahili tomcat'in sağladığı avantajları düşürmeden üretimde normal bir yay uygulaması gibi çalışabilirim. Bu yardımcı olur umarım.


2

Bir üretim ortamında, bir /etc/init.d/ betiği oluşturarak ve onu başlatmak ve durdurmak için uygun çalışma düzeyine bağlanarak, uygulamanızın bir makine yeniden başlatıldığında vb. Yeniden başlatılmasını istiyorsanız doğru yaklaşımdır. Spring Boot, işletim sistemine özgü bir kurulum olduğundan ve tonlarca başka seçenek olduğundan, bunu kapsayacak şekilde genişletilmeyecek, bir chroot hapishanesinde çalışmasını istiyor musunuz, başka bir yazılımdan önce durması / başlatması gerekiyor mu vb.


2

Supervisor adlı uygulamayı kullanabilirsiniz . Süpervizör konfigürasyonunda birden fazla servis ve aynısını yürütmek için yollar tanımlayabilirsiniz.

Java ve Spring önyükleme uygulamaları için komut şöyle olacaktır java -jar springbootapp.jar.

Uygulamanın her zaman çalışır durumda kalması için seçenekler sağlanabilir. Yani EC2 yeniden başlatılırsa Süpervizör uygulamanızı yeniden başlatacaktır.

Başlatma betiklerini /etc/init.d/ içine koymakla karşılaştırıldığında Supervisor'ın kullanımını kolay buldum. Başlangıç ​​betikleri hata durumunda askıda kalır veya bekleme durumuna geçer.


2

Gradle kullanıyorsanız, bunu build.gradle'a ekleyebilirsiniz.

springBoot {
    executable = true
}

Daha sonra uygulamanızı ./your-app.jar yazarak çalıştırabilirsiniz.

Ayrıca, uygulamanızı bir hizmet olarak ayarlamak için burada eksiksiz bir kılavuz bulabilirsiniz

56.1.1 init.d hizmeti olarak kurulum (System V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

şerefe


Aslında bu şu olmalı bootRepackage { executable = true }: Docs.spring.io/spring-boot/docs/current/reference/html/…
Philippe

2

Hizmetsiz Windows İşletim Sisteminde.

start.bat

@ECHO OFF
call run.bat start

stop.bat:

@ECHO OFF
call run.bat stop

run.bat

@ECHO OFF
IF "%1"=="start" (
    ECHO start myapp
    start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
    ECHO stop myapp
    TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
    ECHO please, use "run.bat start" or "run.bat stop"
)
pause

1

Kalıcı veya en azından yarı kalıcı olarak çalıştırmak istediğim uygulamaları ekran-dmS AD / yol / / komut dosyası aracılığıyla başlatıyorum. Bildiğim kadarıyla bu en zarif çözüm.


0

Bu basittir, kod dağıtımınızı bitirmek için spring boot maven eklentisini kullanabilirsiniz.

eklenti yapılandırması şöyle:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
                    </jvmArguments>
                    <profiles>
                        <profile>test</profile>
                    </profiles>
                    <executable>true</executable>
                </configuration>
            </plugin>

Ve jvmArtumentssizin için ekleniyor jvm. profilesuygulamanızı başlatmak için bir profil seçecek. executableuygulamanızın hızlı bir şekilde çalışmasını sağlayabilir.

ve mvnwprojenize eklerseniz veya bir maven ortamınız varsa. Sadece ./mvnw spring-boot:runmvnw veya mvn spring-boot:runmaven için arayabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.