본문 바로가기

Programing/OpenSource

[tomcat] ARP 경고 해결하기

tomcat 으로 가동되는 프로젝트를 로컬에서 사용하게 되었다.

아래와 같은 문구가 계속 마음속에 걸렸다.

정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 프로덕션 환경들에서 최적의 성능을 제공하는, APR 기반 Apache Tomcat Native 라이브러리가, 다음 java.library.path에서 발견되지 않습니다: [/Users/namo/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]

결국 java.library.path 상 APR 라이브러리가 없다는 이야기이다.

 

APR 라이브러리를 얻어서 해당 경로에 넣어주면 되는데 macOS에서 컴파일이 까다로웠다.

apr-1.7.0.tar.gz 를 아파치 Portable Runtime Project에서 다운받아서 소스파일 압축까지 풀었다.

환경을 잡아주고, make하고 make install 하면 되는데

$ ./configure --prefix=/sw/apr148 (설치를 원하는 디렉토리 기재)
$ make
$ make install

make 에러

make 시 아래와 같은 에러가 발생한다.

위의 에러 메시지는 두 가지 내용이 섞여 있다.

iovec 구조체의 중복 선언(redefinition of 'iovec')

xcode 라이브러리에도 iovec 구조체가 있고, api 쪽에도 동일 이름의 구조체가 있다.

C언어에서는 이런 중복 선언을 방지하기 위해 guard를 사용하는데 가드 이름이 달라서 중복 선언이 되게 되는 것이었다.

왼쪽이 APR, 오른쪽이 macos쪽

Xcode.app을 수정하는 것보다 다운받은 소스를 수정하는 것이 좋을 것 같아서 왼쪽의

APR_IOVEC_DEFINED 를 _STRUCT_IOVEC 로 맞춰주었다.

pid_t 크기 설정

또 다른 것은 pid_t 타입의 적절한 타입이 설정이 안되어서이다.

설정을 어디에 해야 하나 고민하다 apr.h 해당 에러부분을 주석처리 했다.

임기응변

이렇게 두 가지를 하고 나니 빌드는 성공했다.

make install 에러

라이브러리를 /usr/local/apr 로 복사를 하려고 하는 데 권한 문제가 있다.

이것은  sudo 명령으로 실행하면 된다.

homebrew 이용하기

이런 수작업이 불편하다면 homebrew를 이용하는 방법도 있다.

$ brew install tomcat-native

의존성은 아래와 같다.

tomcat-native -> apr, openjdk, tomcat

더보기

==> Summary
🍺 /usr/local/Cellar/apr/1.7.0: 59 files, 1.4MB
==> Installing tomcat-native dependency: openjdk
==> Pouring openjdk-15.0.1.catalina.bottle.tar.gz
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /usr/local,
because it shadows the macOS `java` wrapper.

 

If you need to have openjdk first in your PATH run:
 echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc

 

For compilers to find openjdk you may need to set:
 export CPPFLAGS="-I/usr/local/opt/openjdk/include"

 

==> Summary

🍺 /usr/local/Cellar/openjdk/15.0.1: 614 files, 324.9MB
==> Installing tomcat-native dependency: tomcat
==> Caveats
To have launchd start tomcat now and restart at login:
  brew services start tomcat
Or, if you don't want/need a background service you can just run:
  catalina run
==> Summary
🍺 /usr/local/Cellar/tomcat/9.0.39: 634 files, 14.9MB, built in 5 seconds
==> Installing tomcat-native
==> Pouring tomcat-native-1.2.25.catalina.bottle.tar.gz
==> Caveats
In order for tomcat's APR lifecycle listener to find this library, you'll need to add it to java.library.path. This can be done by adding this line to $CATALINA_HOME/bin/setenv.sh

 

  CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/opt/tomcat-native/lib"

 

If $CATALINA_HOME/bin/setenv.sh doesn't exist, create it and make it executable.

==> Summary
🍺 /usr/local/Cellar/tomcat-native/1.2.25: 10 files, 398.4KB
==> Caveats
==> apr apr is keg-only, which means it was not symlinked into /usr/local, because Apple's CLT provides apr.

 

If you need to have apr first in your PATH run:
  echo 'export PATH="/usr/local/opt/apr/bin:$PATH"' >> ~/.zshrc

 

==> openjdk For the system Java wrappers to find this JDK, symlink it with sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

 

openjdk is keg-only, which means it was not symlinked into /usr/local, because it shadows the macOS `java` wrapper.

 

If you need to have openjdk first in your PATH run:
  echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk you may need to set:
  export CPPFLAGS="-I/usr/local/opt/openjdk/include"
==> tomcat
To have launchd start tomcat now and restart at login:
  brew services start tomcat
Or, if you don't want/need a background service you can just run:
  catalina run
==> tomcat-native
In order for tomcat's APR lifecycle listener to find this library, you'll need to add it to java.library.path. This can be done by adding this line to $CATALINA_HOME/bin/setenv.sh

 

  CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/opt/tomcat-native/lib"

 

If $CATALINA_HOME/bin/setenv.sh doesn't exist, create it and make it executable.

/usr/local/opt/tomcat-native/lib 경로에 tomcat-native 라이브러리가 생긴다.

 

/usr/local/Cellar/apr/1.7.0/libexec/lib 에 apr 라이브러리가 생긴다.

아래 명령으로 심볼릭 링크를 만들어주었다.

$ ln -s /usr/local/opt/tomcat-native/lib ~/Library/Java/Extensions

결과 확인

위와 같이 설정 후 로그는 아래와 같이 나온다.

13-Nov-2020 13:26:36.160 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR 버전 [1.7.0]을(를) 사용한, APR 기반 Apache Tomcat Native 라이브러리 [1.2.25]을(를) 로드했습니다.
13-Nov-2020 13:26:36.160 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR 용량정보들: IPv6 [true], sendfile [true], accept filters [false], random [true].
13-Nov-2020 13:26:36.160 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL 설정: useAprConnector [false], useOpenSSL [true]
13-Nov-2020 13:26:36.165 정보 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL이 성공적으로 초기화되었습니다: [OpenSSL 1.1.1h 22 Sep 2020]

효과?

딱히 서버를 시작하는데는 영향이 없는 것으로 보인다.

A: Deploy took 957 milliseconds

B: Deploy took 16,162 milliseconds

A: Deploy took 976 milliseconds

B: Deploy took 16,408 milliseconds