STS에서 'Spring Starter Project'를 생성하고 나면 프로젝트에는 두 개의 'JRE System Library' 가 추가되는 증상이 나타난다. ㅡ_-);;



이 때는 당황하지 말고 침착하게 다음과 같이 대처한다.

  • 프로젝트의 속성창을 띄운다: 프로젝트 선택하고 Alt + Enter 를 치거나 마우스 우클릭하여 Properties 를 선택

  • Java Build Path 를 선택하고 [Libraries] 를 선택한다.
  • 하나를 선택하고 [Remove] 버튼을 눌러 두 개를 모두 삭제한다.
  • [Add Library] 를 선택하고 'JRE System Library' 를 선택한다.

  • 'Workspace default JRE' 를 선택하고 [Finish] 를 누른다.

  • [Apply] 를 누르면 정상적으로 변한 프로젝트를 확인할 수 있다.


1. PID란?

PID(Process Identifier)는 각 프로세스/스레드를 구분해주는 번호다.

— PID란?

2. 스프링부트에서 PID 생성하도록 하기

스프링부트는 실행되고 있는 애플리케이션의 pid 를 생성하도록 설정하는 것이 쉽다.

2.1. 설정

  • application.yml  spring.pid.file 속성을 정의

spring:
  pid:
    file: springboot-app.pid

spring.pid.file 속성을 정의하지 않으면 application.pid 라는 기본이름으로 생성한다.

  • @SpringBootApplication 이 붙은 Application 클래스 수정

    • 기존

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
  • 변경

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Application.class);
    app.addListeners(new ApplicationPidFileWriter());   // pid 를 작성하는 역할을 하는 클래스 선언
    app.run(args);
}

2.2. 확인

  1. 간단하게 실행

$ ./gradlew bootrun &

3. PID를 이용한 프로세스 죽이기

  1. 스프링부트 앱 실행

$ ./gradlew bootrun &
  1. 생성된 pid 파일 확인

$ ls
springboot-app.pid  bin  build  build.gradle  gradle  gradlew  gradlew.bat  src
$ cat application.pid
{pid}
  1. 프로세스 죽이기

kill -9 $(cat ./springboot-app.pid)
// 앱이 실행되면서 생성된

4. 정리

스프링부트 1.3.x 버전에 들어서면서 스프링부트리를 유닉스/리눅스 서비스로 등록할 수 있는 기능이 추가되었다. 여기서 사용하기 위해 추가된 기능이라고 보면 될듯 싶다. 애플리케이션이 실행되면 실행되는 프로세스ID를 발급받고 이 프로세스ID를 이용해서 애플리케이션을 죽일 수 있게 된다. 이는 컨테이너나 마이크로서비스 용 애플리케이션에 유용한 기술이라고 생각한다.


문제

그레이들gradle 으로 구성한 멀티프로젝트를 이클립스에서 불러오게 되면 Classpath Dependency Validator 가 검증되지 않은 클래스패스 상에 의존성을 가진 프로젝트가 있다는 메시지를 던진다.

꽤 거슬린다. ㅡ_-);;

이에 대해서 인터넷 검색을 해봤다.

여기서 해답을 보면 프로젝트를 선택하고 gradle cleanEclipse eclipse 를 해서 이클립스가 그레이들 네이처를 잊어 먹도록 한 후에 수동으로 처리하도록 하는 수를 쓰고 있다.



해결책

해결방법은 간단하다.

[Preference] - 'Validation' - 'Classpath Dependency Validator' 비활성화



하면 끝난다.

경고를 무시해도, 그레이들에 의해서 프로젝트 의존성이 처리가 되기 때문에 큰 문제는 없다.

Eclipse 3.6.x 버전이 되면서 노트북에서 실행되는 이클립스가 얼어버리는 되는 상황들이 빈번하게 발생하기 시작했다. 코딩을 하다가 탭을 바꾸거나 자동완성 기능을 사용하려고 하면 화면이 멈추는 증상에 너무 짜증이 나서 어떻게 할까 고민하던 차다.

지금 노트북에는 외장그래픽으로 ATI Radeon 이 포함되어 있다.

우분투랑 ATI 라데온 조합이 안좋은 건 이 노트북을 사용하면서 실감했다. 우분투와 궁합이 괜찮은 건 엔비디아nVidia 와 인텔intel 이다.

이클립스를 실행할 때마다 너무 짜증이나서 운영체제를 다시 설치할까 했는데, 문득 이에 대한 인터넷 검색을 해보자 하는 생각이 들었다(이렇게 쓴지 한달이 좀 넘은 것 같은데...).

인터넷 검색으로는 ubuntu 14.04 eclipse slow 으로 검색을 시작했다. 그랬더니 나오는 첫번째 결과가 똬악!

을 통해서 간단하게 방법을 찾았다. 해결책은 크게 두 가지 방법이 있다.

  • eclipse.sh 실행 스크립트 작성

    export SWT_GTK3=0
    export UBUNTU_MENUPROXY=0
    ./eclipse
  • eclipse.desktop 애플리케이션 등록정보 수정

    [Desktop Entry]
    Version=4.4
    Name=Eclipse
    Comment=Eclipse IDE
    Exec=env UBUNTU_MENUPROXY=0 SWT_GTK3=0 =/home/honeymon/development/eclipse/eclipse
    Icon=/home/honeymon/development/eclipse/icon.xpm
    Terminal=false
    Type=Application
    Categories=Utility;Application

위의 두 가지 방법 중에 후자의 것을 사용했다.


문제가 생긴 이유는, GTK3 의 SWT 가 최적화되어 있지 않기 때문에 나타나는 버그로 보인다.

[스프링부트] 빌드시 깃 커밋버전 정보 포함시키기

지금 개발하고 있는 애플리케이션은 깃 플로우git flow 를 이용해서 출시하고 있다. 출시할 때는 출시release 기능을 이용해서 master 브랜치에 태그를 생성하고 이를 배포하는 형태로 개발하고 있다.

애플리케이션을 사용하고 있는 필드가 늘어나고 있는데, 이 필드에 배포된 변경이력만으로는 어디까지 개발된 애플리케이션인지 알 수가 없다. 그러다가 스프링부트에서 Git commit information 를 빌드파일이 포함시킬 수 있는 부분을 확인한다. 빌드되는 시점에 커밋정보git.properties 에 저장하여 함께 배포하는 기능이다.

이 기능을 사용하려면,

JDK8 에서 빌드되어야 한다.


gradle-git-properties 사용절차

gradle-git-properties 플러그인 추가

  • 참고: com.gorylenko.gradle-git-properties

    Produce git.properties for spring-boot-actuator

  • build.gradle 수정

    buildscript {
        ext {
          springBootVersion = '1.3.2.RELEASE'
        }
        repositories {
          mavenCentral()
          maven {
                url "https://plugins.gradle.org/m2/"  //gradle 플러그인 URL
              }
        }
        dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
          classpath "gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.4.11" // gradle-git-properties
        }
    }
     
    apply plugin: "com.gorylenko.gradle-git-properties"


빌드!


빌드 후 결과

  • 빌드된 배포파일 압축을 해제해보면 다음과 같은 구조로 되어 있다. gradle build 생성물 압축해제 그림

    • git.properties
      #
      #Fri Feb 26 10:40:36 KST 2016
      git.commit.id=bad6de66e0ecc9a2f2e2402fdac88f63d88a2305
      git.commit.time=1456448574
      git.commit.user.name=ihoneymon
      git.commit.id.abbrev=bad6de6
      git.branch=release/1.0.1.RELEASE
      git.commit.message.short=\#38 Code cleaning
      git.commit.user.email=ihoneymon@gmail.com
      git.commit.message.full=\#38 Code cleaning\n


액츄에이터 기능 중 info 가 활성화 되어 있다면!!

다양한 버전의 애플리케이션 배포본이 존재할 때 어떤 버전으로 운영되고 있는지 확인하는데 요긴할 듯 하다.

+ Recent posts