スプリングブヌト開始から運甚たで



この蚘事では、Spring Bootで小さなプロゞェクトを䜜成し、戊闘サヌバヌに展開するために必芁なすべおの手順の抂芁を説明したす。



JavaずSpringの哲孊に関する長い前奏曲を匕きずり出さないで、すぐにビゞネスに取りかかりたす。



たず、必芁なすべおのテクノロゞヌ動物園少なくずもSpring、JPA、JDBCを実装しお、アプリケヌションフレヌムワヌクを䜜成する必芁がありたす。 スプリングブヌトが登堎する前は、もちろんコヌドビンに䜜業甚のドラフトがない限り、これに倚くの時間を費やす必芁がありたした。 そしお、倚くの人がJavaで小さなWebプロゞェクトを開発するのを止めるのは、そのようなフレヌムワヌクを䜜成する耇雑さです。 もちろん、パフォヌマンスの䜎䞋hiの偎面に䌌たフレヌムワヌクを䜜成するこずができなかった䞍自由な春のルヌがあるずはいえ、それでも構成ファむルの数ず耇雑さにより、蚓緎されおいない開発者は長い間それらを熟考したした。 ただし、BootずSpring 4の登堎により、生掻が少し楜になり、構成ファむルの数が著しく枛少したした。



そう、フレヌム、はい。



Intellij Idea 14.1をお持ちの堎合、フレヌムワヌクに問題はないはずです。プロゞェクトを䜜成するための特別なりィザヌドFile-New-Project ...- Spring Initializrを䜿甚しおすべおを実行できたす。 次に、プロゞェクトの名前を瀺し、関心のあるテクノロゞWeb、JDBC、JPA、PostgreSQLを遞択しおプロゞェクトを䜜成するだけです。



このIDEがない堎合は、 Spring Boot CLIをダりンロヌドしお、INSTALL.txtの指瀺に埓っおください。 システム倉数SPRING_HOMEbinフォルダヌではなく、Spring Bootのフォルダヌぞのパスを蚭定し、WindowsのPATHシステム倉数にSPRING_HOME / binぞのパスを远加する必芁がありたす。



そこで、Spring Consoleをセットアップしたした。今床はプロゞェクトを䜜成したす。 これを行うには、次のコマンドを䜿甚したす。

spring init --dependencies=web,data-jpa,jdbc yourapp
      
      





曎新

さらに、コメントで曞いたように、Webコンストラクタもありたす start.spring.io



次に、結果のフレヌムワヌクをお気に入りのIDEにむンポヌトし、ニヌズに合わせお倉曎を開始したす。



最初に、webappsフォルダヌをsrc /メむンディレクトリに远加したす。 春が望むように、resourcesフォルダヌではなく、その䞭にすべおのWebリ゜ヌスを䜜成したす。 実際、リ゜ヌスフォルダヌにファむルを䜜成するず、サヌバヌを再起動せずにWebリ゜ヌスに加えられた倉曎を確認する機䌚が倱われたす。 たた、Webペヌゞ䞊の倉曎されたテキストを衚瀺するためにWebサヌバヌを再起動する必芁がある堎合、これはむラむラする可胜性がありたす。



次に、webappsフォルダヌに、適切なリ゜ヌスを配眮するindex.htmlファむルずcss、js、font、imagesフォルダヌを䜜成したす。



たずえば、最も単玔なindex.htmlフレヌムワヌクを䜜成したしょう。

 <!DOCTYPE html> <html lang="en"> <head> <title>Yourapp</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <h1> HELLO WORLD </h1> </body> </html>
      
      







pom.xmlファむルを倉曎したす

次のようなものが埗られるはずです。

 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yourcompany</groupId> <artifactId>yourapp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>YourApp</name> <description></description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <start-class>com.yourcompany.Application</start-class> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4-1201-jdbc41</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${basedir}/target/classes/static</outputDirectory> <resources> <resource> <directory>src/main/webapp</directory> <filtering>true</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
      
      





pomファむルから次のこずがわかりたす。

Java 8を䜿甚したす詊しおみたしょう。 アプリケヌションクラスはcom.yourcompany.Applicationず呌ばれたすたずえば、DemoApplicationず呌ばれる暙準生成クラスの名前を忘れないでください。



postgresql 9.4を䜿甚したすお䜿いのマシンにロヌカルにむンストヌルするのもいいでしょう。 デヌタベヌスずのやり取りのための接続プヌルは、最もファッショナブルで生産性の高いHikariCPです。 さらに、特別なプラグむンを䜿甚しお、最終的なjarを生成するずきに、スプリングブヌトが必芁ずするように、すべおのデヌタをwebappからresources / staticに転送したす。 そうしないず、jarニックネヌムの実行時にwebappsフォルダヌに䜜成したすべおのWebペヌゞを衚瀺できたせん。



構成パッケヌゞを远加し、その䞭にJpaConfigクラスを䜜成したす。

 @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackageClasses = Application.class) public class JpaConfig implements TransactionManagementConfigurer { @Value("${dataSource.driverClassName}") private String driver; @Value("${dataSource.url}") private String url; @Value("${dataSource.username}") private String username; @Value("${dataSource.password}") private String password; @Value("${hibernate.dialect}") private String dialect; @Value("${hibernate.hbm2ddl.auto}") private String hbm2ddlAuto; @Bean public DataSource configureDataSource() { HikariConfig config = new HikariConfig(); config.setDriverClassName(driver); config.setJdbcUrl(url); config.setUsername(username); config.setPassword(password); return new HikariDataSource(config); } @Bean public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setDataSource(configureDataSource()); entityManagerFactoryBean.setPackagesToScan("com.yourcompany"); entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); Properties jpaProperties = new Properties(); jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, dialect); jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, hbm2ddlAuto); entityManagerFactoryBean.setJpaProperties(jpaProperties); return entityManagerFactoryBean; } @Bean public PlatformTransactionManager annotationDrivenTransactionManager() { return new JpaTransactionManager(); } }
      
      





さらに、application.propertiesファむルに次の行を远加したす。

 dataSource.driverClassName=org.postgresql.Driver dataSource.url=jdbc:postgresql://<ip- ,   PostgreSQL>:5432/yourapp_data dataSource.username=postgres dataSource.password= hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect hibernate.hbm2ddl.auto=update
      
      





最埌に、Application.javaで初期化文字列を次のように倉曎したす。

 SpringApplication.run(new Class<?>[] {Application.class, JpaConfig.class}, args);
      
      





したがっお、PostgreSQL DBMSぞの接続を構成したした。



デヌタベヌス自䜓ず単玔なテヌブルを䜜成するこずを忘れないでください。 これは、PgAdminを䜿甚しお行うのが最も䟿利です。

空のyourapp_dataデヌタベヌスを䜜成した埌、テヌブル䜜成スクリプトを実行したす。

 CREATE TABLE yourapp_data ( data_id uuid NOT NULL, data_description character varying(100) NOT NULL, CONSTRAINT yourapp_data_pk PRIMARY KEY (data_id) ) WITH ( OIDS=FALSE ); ALTER TABLE yourapp_data OWNER TO postgres;
      
      





さあ、プロゞェクトに少し詰め蟌みたしょう。 ぀たり、䜕らかの皮類のデヌタベヌス゚ンティティを远加しお操䜜方法を孊習し、クラむアントから圢成のためにデヌタを受信し、既に䜜成された゚ンティティに関する同じデヌタをクラむアントに送信したす。



コントロヌラ、゚ンティティ、リポゞトリ、サヌビス、utilsパッケヌゞを䜜成したす。



゚ンティティパッケヌゞで、むンタヌフェむスを䜜成したす。

 public interface DomainObject extends Serializable { }
      
      





そしお本質

 public class Data implements DomainObject { private UUID id; private String description; public Data(UUID id, String description) { this.id = id; this.description = description; } public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
      
      





この䟋ではJPAおよびHibernateアノテヌションを䜿甚したせん。これらのテクノロゞヌにより䜜業が倧幅に遅くなるため芁求は玔粋なjdbcよりも10倍遅く実行できる、ORMが実際に必芁ずされる非垞に耇雑な゚ンティティがないため、その埌、通垞のjdbcTemplateを䜿甚したす。



リポゞトリむンタヌフェむスを䜜成したす。

 public interface DataRepository<V extends DomainObject> { void persist(V object); void delete(V object); Set<String> getRandomData(); }
      
      





そしおその実装

 @org.springframework.stereotype.Repository("dataRespitory") public class DataRepositoryImpl implements DataRepository<Data> { @Autowired protected JdbcOperations jdbcOperations; @Override public void persist(Data object) { Object[] params = new Object[] { object.getId(), object.getDescription() }; int[] types = new int[] { Types.VARCHAR, Types.VARCHAR }; jdbcOperations.update("INSERT INTO yourapp_data(\n" + " data_id, data_description)\n" + " VALUES (cast(? as UUID), ?);", params, types); } @Override public void delete(Data object) { jdbcOperations.update("DELETE FROM yourapp_data\n" + " WHERE data_id = '" + object.getId().toString() + "';"); } @Override public Set<String> getRandomData() { Set<String> result = new HashSet<>(); SqlRowSet rowSet = jdbcOperations.queryForRowSet("SELECT data_description FROM yourapp_data p ORDER BY RANDOM() LIMIT 50;"); while (rowSet.next()) { result.add(rowSet.getString("data_description")); } return result; } }
      
      





すでに説明したjdbcTemplateの代わりに、ご芧のずおり、むンタヌフェむスであるJdbcOperationsを䜿甚したす。 むンタヌフェむスはどこからでも実装から分離する必芁がありたす。第䞀に、スタむリッシュでファッショナブルで若々しく、第二に、春はオブゞェクトに暙準jdk'shnyプロキシを䜿甚するため、実装を盎接泚入できないためです。本栌的なアスペクトずAspectJコンパむル時りィヌビングを玹介するたで。 私たちの堎合、アプリケヌションをオヌバヌロヌドさせないためにこれは必芁ありたせん。



すでに少しありたす。 サヌビスを䜜成したす優れた開発者であり、ビゞネスロゞックをDBMSず連携するロゞックから分離する必芁がありたすか。



むンタヌフェヌス

 public interface DataService { public boolean persist(String problem); public Set<String> getRandomData(); }
      
      





実装

 @Service("dataService") public class DataServiceImpl implements DataService { private static final Logger LOG = LoggerFactory.getLogger(DataServiceImpl.class); @Autowired @Qualifier("dataRespitory") private DataRepository dataRepository; @Override public boolean persist(String problem) { try { dataRepository.persist(new Data(UUID.randomUUID(), problem)); return true; } catch (Exception e) { LOG.error("ERROR SAVING DATA: " + e.getMessage(), e); return false; } } @Override public Set<String> getRandomData() { return dataRepository.getRandomData(); } }
      
      





玠晎らしい。 次に、コントロヌラヌの実装に必芁なヘルパヌクラスをいく぀か䜜成したす。

 public class RestException extends Exception { public RestException() { } public RestException(String message) { super(message); } public RestException(String message, Throwable cause) { super(message, cause); } public RestException(Throwable cause) { super(cause); } public RestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
      
      





これが䟋倖の実装です。 必須ではありたせんが、将来䟿利になる可胜性がありたすが、次のクラスが関連付けられおいたす。

 @Controller public class ExceptionHandlerController { private static final Logger LOG = Logger.getLogger(ExceptionHandlerController.class); @ExceptionHandler(RestException.class) public @ResponseBody String handleException(RestException e) { LOG.error(": " + e.getMessage(), e); return ": " + e.getMessage(); } }
      
      





コントロヌラヌでこのような゚ラヌをキャッチした堎合、このメ゜ッドでさらに凊理されたす。

最埌に、クラむアントに送信するためのデヌタ構造を圢成する小さなクラシックを䜜成したす。

 public class Ajax { public static Map<String, Object> successResponse(Object object) { Map<String, Object> response = new HashMap<String, Object>(); response.put("result", "success"); response.put("data", object); return response; } public static Map<String, Object> emptyResponse() { Map<String, Object> response = new HashMap<String, Object>(); response.put("result", "success"); return response; } public static Map<String, Object> errorResponse(String errorMessage) { Map<String, Object> response = new HashMap<String, Object>(); response.put("result", "error"); response.put("message", errorMessage); return response; } }
      
      





ヘルパヌクラスのすべおが完了したした。 コントロヌラヌを曞くこずは残っおいたす。 コルクず同じくらい簡単です

 @Controller public class DataController extends ExceptionHandlerController { private static final Logger LOG = Logger.getLogger(DataController.class); @Autowired @Qualifier("dataService") private DataService dataService; @RequestMapping(value = "/persist", method = RequestMethod.POST) public @ResponseBody Map<String, Object> persist(@RequestParam("data") String data) throws RestException { try { if (data == null || data.equals("")) { return Ajax.emptyResponse(); } dataService.persist(data); return Ajax.emptyResponse(); } catch (Exception e) { throw new RestException(e); } } @RequestMapping(value = "/getRandomData", method = RequestMethod.GET) public @ResponseBody Map<String, Object> getRandomData() throws RestException { try { Set<String> result = dataService.getRandomData(); return Ajax.successResponse(result); } catch (Exception e) { throw new RestException(e); } } }
      
      





2぀の方法がありたす-受信したデヌタを保存し、ランダムデヌタの䞀郚をクラむアントに提䟛したす。 コントロヌラヌは、前に䜜成したExceptionHandlerControllerから継承されたす。 䟋倖凊理はテンプレヌトずしおのみ蚘述されおおり、それに応じお調敎する必芁がありたす。



そのため、サヌバヌコヌドの䞻芁郚分が蚘述され、クラむアントでの動䜜を確認する必芁がありたす。 これを行うには、index.htmlファむルを改良するず同時に、jqueryラむブラリをjsディレクトリに远加する必芁がありたす。

index.html

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>YourApp</title> <script src="js/jquery-2.1.3.min.js"></script> </head> <body> <h1> HELLO WORLD </h1> <input type="text" id="data"/> <a id="post" href="#">POST</a> <a id="get" href="#">GET</a> <div id="container"></div> </body> <script> $('#get').click(function () { $.ajax({ type: "GET", cache: false, url: '/getRandomData', data: "", success: function (response) { var html = ""; $.each(response.data, function (i) { html = html + response.data[i] + "<br/>"; }); $('#container').html(html); } }); }); $('#post').click(function () { if (!$("#data").val()) { alert("Enter your data!"); } else { $.ajax({ type: "POST", cache: false, url: '/persist', data: { 'data': $("#data").val() }, success: function (response) { $('#get').click(); } }); } }); </script> </html>
      
      





はい、UIはそれほど矎しくはありたせんでしたが、その助けを借りおアプリケヌションをテストできたす。

プロゞェクトを実行したす。 Intellij Ideaでは、これは特別なスタヌトアップ構成スプリングブヌトで実行できたす。

すべおが正しく完了したら、localhost8080でHello Worldヘッダヌ、入力行、2぀のボタンを確認できたす。 入力行に䜕かを入力しお、POSTボタンをクリックしおみおください。 その埌、入力フィヌルドの䞋に同様のテキストが衚瀺される堎合、すべおが正垞に機胜しおいたす。 ニヌズに合わせおプロゞェクトを倉曎し、ファッショナブルなUI䟋 materializecss.com を远加し、合理的で芪切な氞遠のものを䜜成したす。



しかし、遅かれ早かれ、あなたはあなたが望むこずをするでしょう、そしお、問題はあなたの頭脳を倧衆にもたらす方法です。 これは蚘事の第2郚になりたす。



小さいながらも重芁なものから始めたしょう。

プロゞェクトが小さい堎合でも、独自のドメむンが必芁です。 アむデアをただ走り回っおいるだけで、同じgodaddyにドメむンを登録するのにあたりお金をかけたくない堎合は、無料の代替手段freenom.comを䜿甚できたす。



このサヌビスでは、ドメむンを.tk、.ml、.ga、.cf、.gqゟヌンに無料で登録できたす

はい、最良のゟヌンではありたせんが、次のずおりです。





次に、これらすべおが回転するサヌバヌを取り䞊げたしょう。 プロゞェクトは小さいので、サヌバヌは小さく収たりたす。 理想的には十分なVPS。 www.digitalocean.comなど、さたざたな堎所で入手できたす。

登録しお、最も単玔なドロップレットを䜜成し、その䞊にubuntuを配眮したす私の堎合はubuntu 12.04です、このシステムの詳现な手順に぀いお説明したすが、残りはほが同じです



さお、サヌバヌがありたす。プロゞェクトをアップロヌドしたす。



開始するには、プロゞェクトmaven'omを収集したす。 IDEを介しおこれを行うか、最悪の堎合、プロゞェクトのルヌトディレクトリに移動しおmvn clean installコマンドを発行したすWindowsのシステム倉数パスでmavenぞのパスを指定する必芁がありたす。 コマンドが完了するず、アセンブルされたjarはロヌカルリポゞトリデフォルトでは.m2ずいう名前に配眮され、そこからプルしおサヌバヌに送信できたす。



Windowsを実行しおいる堎合、ファむルをサヌバヌに転送するには、 WinSCPを䜿甚したす。

次に、WindowsのputtyたたはLinuxのsshを䜿甚しおサヌバヌにアクセスしたす。

jar-nicknameがコピヌされたディレクトリに移動し、java -jar youapp.jarコマンドで実行しようずしたす



おそらく、うたくいきたせんでした。 そしお、なぜですか 私たちのプロゞェクトはJava 8で䜜成されたした。java-versionコマンドを䜿甚しお、サヌバヌ䞊にあるJavaを確認できたす。 ほずんどの堎合、6たたは7です。



しかし、倱望しないように、新しいバヌゞョンを蚭定したす。

 sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
      
      





今ではpostgresの番です。 その前に、開発者のマシンでロヌカルバヌゞョンを䜿甚したした。今床は、DBMSをサヌバヌに配眮したす。



これを行うには、たずコマンドのマゞックシヌケンスを実行したす。

 sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' sudo apt-get install wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get upgrade sudo apt-get install postgresql-9.4 postgresql-contrib-9.4
      
      





postgresを実行したす。

 sudo service postgresql start
      
      





次に、psql loginコマンドを実行したす。

 sudo -u postgres psql
      
      





パスワヌドを蚭定したす。

 \password postgres
      
      





そしお、\ qコマンドを䜿甚しお終了したす



ファむル/etc/postgresql/9.4/main/postgresql.confを線集し、行#listen_addresses = 'localhost'をlisten_addresses = '*'に倉曎したす

したがっお、pgadminを䜿甚しお倖郚からpostgresqlに接続できたす。 もちろん、セキュリティ䞊の理由からこれを回避するこずをお勧めしたす。すべおが蚭定およびデバッグされたら、この機胜を無効にしたす。



次に、ファむル/etc/postgresql/9.4/main/pg_hba.confを線集したす

次のように、2぀の新しい行を远加し、127.0.0.1の1行を倉曎する必芁がありたす。

 host all all 127.0.0.1/32 trust host all all <ip- >/32 trust host all all <ip-  >/32 trust
      
      





私は個人的にプロゞェクトの起動に問題があり、それによっお䞎えられたアドレスのパスワヌド怜蚌を無効にしおいるため、md5を信頌するように意図的に倉曎したした。 持っおいないかもしれたせん。



これですべおが蚭定されたした。 postgresを無限に調敎するこずはできたすが、小さなプロゞェクトしかないため、今のずころはそのたたにしたす。



postgresを再起動したす。
  sudo service postgresql restart
      
      



その動䜜を確認したす。



postgresのセットアップで、すべおが完了したした。スクリプトの次は䜕ですか



前述のように、java -jar youapp.jarコマンドで、組み立おられたjarを実行できたす。

ただし、このような起動では、倖郚からサむトにアクセスするには、ポヌトデフォルトでは8080を登録する必芁がありたす。 ナヌザヌがアドレスを入力するだけでサむトにアクセスできるように、プロキシサヌバヌが必芁です。 事前蚭定が必芁なnginxを䜿甚するこずは可胜です。



nginxをむンストヌルしたす。

 sudo apt-get install nginx
      
      





私の堎合、nginxのルヌトディレクトリは/ etc / nginxでした。 そこで、最初に/ sites_available / defaultファむルを次のように倉曎する必芁がありたす。

 server { listen 80; server_name youapp.com; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080/; } }
      
      





ただし、これだけではありたせん。 たた、私たちが蚭定したプロキシをサポヌトするようにプロゞェクトを修正する必芁がありたす。 幞い、これを行うのは難しくありたせん。application.propertiesに行を远加するだけです倉曎を新しいバヌゞョンに入力するこずを忘れないでください。

 server.tomcat.remote_ip_header=x-forwarded-for server.tomcat.protocol_header=x-forwarded-proto
      
      





これで、service nginx startコマンドを䜿甚しおnginxを起動し、プロゞェクトを開始できたす。 サむトリンクで利甚できたす。ドメむンをただ賌入しおいない堎合は、ポヌトを指定せずにそのIPアドレスで利甚できたす。



もう1぀小さなタッチがありたす。 䞊蚘の方法でプロゞェクトを垞に開始するのは少し䞍䟿です。 プロゞェクトの開始時に、サヌバヌの入力コン゜ヌルが解攟され、sshセッションを終了した埌にアプリケヌションが閉じず、アプリケヌションログがどこかに保存されおいるず䟿利です。 これは、nohupコマンドを䜿甚しお実行できたす。 最初に、bashスクリプトを䜜成し、script.shを呌び出したす。

 #!/bin/bash java -jar youapp.jar
      
      





パフォヌマンスに察する暩利を芏定したす。

 chmod +x ./script.sh
      
      





そしお、コマンドを実行したす

 nohup ./start.sh > log.txt 2>&1 &
      
      





すべお、アプリケヌションが実行されおいたす。



アプリケヌションを停止するには、pkill -9 javaコマンドこれがサヌバヌ䞊で実行されおいる唯䞀のJavaアプリケヌションである堎合を䜿甚するか、htopナヌティリティを䜿甚しおこのプロセスを匷調衚瀺し、F9ボタンを抌しお、リストの巊偎のSIGKILLを遞択しおEnterキヌを抌したす。 泚初めお動䜜しない堎合があり、手順を繰り返す必芁がありたす。



さお、すべおが正しく行われおいれば、プロゞェクトのサむトをブラりザで開いお結果を楜しむこずができたす。



PS䜕も芋逃しおいないこずを願っおいたす。 間違いを芋぀けた堎合は、個人的なメッセヌゞでこれに぀いお曞いおください。 テキストはすぐに修正されたす。



All Articles