Bagaimana cara menjalankan jar yang dapat dieksekusi boot musim semi di lingkungan Produksi?

105

Metode penerapan yang disukai Spring boot adalah melalui file jar yang dapat dieksekusi yang berisi tomcat di dalamnya.

Ini dimulai dengan yang sederhana java -jar myapp.jar.

Sekarang, saya ingin menerapkan jar itu ke server linux saya di EC2, apakah saya melewatkan sesuatu atau apakah saya benar-benar perlu membuat skrip init untuk memulai aplikasi dengan benar sebagai daemon?

Jika saya hanya memanggil java -jaraplikasi mati saat saya log out.

Saya dapat memulainya di layar atau nohup tetapi itu tidak terlalu elegan dan memulai ulang di server saya akan memaksa saya untuk masuk dan memulai proses secara manual.

Jadi, apakah sudah ada sesuatu untuk tugas di musim semi boot?

Cleber Goncalves
sumber
1
nohup / layar (metode kotor), init / systemd / upstart (metode yang tepat)
@RC Ya, banyak yang saya tahu, seperti yang saya sebutkan, / sbin / init dengan skrip kustom di /etc/init.d, akan melakukan pekerjaan itu, tetapi apakah itu benar-benar gagasan bahwa setiap orang harus membuat skrip sendiri untuk mengelola daemon (mulai, hentikan, mulai ulang, status)? Terasa ada yang kurang dari solusi itu.
Cleber Goncalves
Saya Anda merasa ada sesuatu yang hilang di musim semi-boot (ini adalah proyek yang benar-benar "segar" btw) cukup hubungi tim yang bertanggung jawab dan buat proposal evolusi.
Nah, jika Anda membuat arsip perang, Anda dapat menggunakan versi distribusi Anda di Tomcat yang akan memiliki skrip init yang siap digunakan. Di sisi lain, jika Anda menggunakan pendekatan jar yang dapat dieksekusi, Anda harus membuat skrip init kustom Anda sendiri. Tidak yakin apakah itu di ranah boot, tetapi jelas hilang, yang agak aneh, oleh karena itu saya bertanya jika saya melewatkan sesuatu. Akan mem-ping mereka.
Cleber Goncalves
1
Lihat di sini untuk diskusi dan ide yang ada.
Dave Syer

Jawaban:

96

Harap diperhatikan bahwa sejak Spring Boot 1.3.0.M1, Anda dapat membuat jar yang sepenuhnya dapat dijalankan menggunakan Maven dan Gradle.

Untuk Maven, cukup sertakan yang berikut ini di pom.xml:

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

Untuk Gradle, tambahkan cuplikan berikut ke Anda build.gradle:

springBoot {
    executable = true
}

Jar yang dapat dijalankan sepenuhnya berisi skrip tambahan di bagian depan file, yang memungkinkan Anda untuk menghubungkan jar Spring Boot Anda ke init.datau menggunakan systemdskrip.

init.d contoh:

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

Ini memungkinkan Anda untuk memulai, menghentikan, dan memulai ulang aplikasi Anda seperti:

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

Atau gunakan systemdskrip:

[Unit]
Description=yourapp
After=syslog.target

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

[Install]
WantedBy=multi-user.target

Informasi lebih lanjut di tautan berikut:

corleone.dll
sumber
4
Anda mungkin juga perlu melakukannya $ chmod +x /etc/init.d/yourappuntuk dapat memulai / menghentikan / memulai ulang
Rohith Nandakumar
Anda harus selalu memberikan izin kepada pengguna layanan Anda untuk membaca dan menjalankan file jar. Anda juga harus mengonfigurasi Java default untuk server dan variabel lingkungan Java agar semuanya berfungsi.
micaro
Ini tidak berhasil! Saya telah mencobanya dan saya mendapatkan kesalahan berikut: Gagal memulai MyApp.service: Unit MyApp.service tidak ditemukan
Martijn Hiemstra
9

Sejauh ini cara paling mudah dan andal untuk menjalankan aplikasi Spring Boot dalam produksi adalah dengan Docker. Gunakan Docker Compose, Docker Swarm atau Kubernetes jika Anda perlu menggunakan beberapa layanan yang terhubung.

Berikut panduan sederhana Dockerfiledari panduan resmi Spring Boot Docker untuk Anda mulai:

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" ]

Berikut ini contoh baris perintah untuk menjalankan container sebagai daemon:

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

Aplikasi boot Spring saya memiliki dua penginisialisasi. Satu untuk pengembangan dan satu lagi untuk produksi. Untuk pengembangan, saya menggunakan metode utama seperti ini:

@SpringBootApplication
public class MyAppInitializer {

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

}

Penginisialisasi saya untuk lingkungan produksi memperluas SpringBootServletInitializer dan terlihat seperti ini:

@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);
    }

}

Saya menggunakan gradle dan file build.gradle saya menggunakan plugin ' WAR '. Ketika saya menjalankannya di lingkungan pengembangan, saya menggunakan tugas bootrun . Sedangkan ketika saya ingin menyebarkannya ke produksi, saya menggunakan tugas assemble untuk menghasilkan WAR dan menyebarkan.

Saya dapat menjalankan seperti aplikasi pegas normal dalam produksi tanpa mengabaikan keuntungan yang diberikan oleh kucing jantan bawaan saat mengembangkan. Semoga ini membantu.

O-OF-N
sumber
2

Dalam lingkungan produksi, Anda ingin aplikasi Anda dimulai lagi saat mesin dimulai ulang, dll., Membuat skrip /etc/init.d/ dan menautkan ke runlevel yang sesuai untuk memulai dan menghentikannya adalah pendekatan yang benar. Spring Boot tidak akan mencakup ini karena ini adalah pengaturan khusus sistem operasi dan ada banyak pilihan lain, apakah Anda ingin menjalankannya di penjara chroot, apakah perlu berhenti / mulai sebelum beberapa perangkat lunak lain, dll.

spstorey
sumber
2

Anda bisa menggunakan aplikasi bernama Supervisor . Dalam konfigurasi supervisor Anda dapat menentukan beberapa layanan dan cara untuk menjalankannya.

Untuk aplikasi boot Java dan Spring, perintahnya adalah java -jar springbootapp.jar.

Pilihan dapat diberikan untuk menjaga aplikasi tetap berjalan, jadi jika EC2 restart maka Supervisor akan merestart aplikasi Anda

Saya menemukan Supervisor mudah digunakan dibandingkan dengan meletakkan skrip startup di /etc/init.d/. Skrip startup akan hang atau masuk ke status menunggu jika terjadi kesalahan.

unnik
sumber
2

Jika Anda menggunakan gradle, Anda bisa menambahkan ini ke build.gradle Anda

springBoot {
    executable = true
}

Anda kemudian dapat menjalankan aplikasi Anda dengan mengetik ./your-app.jar

Selain itu, Anda dapat menemukan panduan lengkap di sini untuk menyiapkan aplikasi Anda sebagai layanan

56.1.1 Instalasi sebagai layanan init.d (Sistem V)

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

Bersulang

isijara
sumber
Sebenarnya itu seharusnya bootRepackage { executable = true }Lihat docs.spring.io/spring-boot/docs/current/reference/html/…
Philippe
2

Di OS Windows tanpa Layanan.

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
Stéphane GRILLON
sumber
1

Saya memulai aplikasi yang ingin saya jalankan terus-menerus atau setidaknya semi permanen melalui layar -dmS NAMA / path / ke / script. Sejauh yang saya ketahui, ini adalah solusi paling elegan.

Scrayos
sumber
0

Ini sederhana, Anda dapat menggunakan plugin maven boot musim semi untuk menyelesaikan penerapan kode Anda.

konfigurasi plugin seperti:

<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>

Dan, jvmArtumentsadalah menambahkan untuk Anda jvm. profilesakan memilih profil untuk memulai aplikasi Anda. executabledapat membuat aplikasi Anda berjalan dengan cepat.

dan jika Anda menambahkan mvnwke proyek Anda, atau Anda memiliki enveriment ahli. Anda bisa memanggil ./mvnw spring-boot:runmvnw atau mvn spring-boot:runmaven.

BeeNoisy
sumber