728x90
반응형
상황
- OpenJDK 8 binary 버전을 받아서 압축풀고, Tomcat에 CLASS_PATH 잡아준다음 Excel 다운로드 같은 작업을 할 경우 다음과 같은 NPE 오류가 발생했다.
- 개인PC에서는 정상적으로 동작하는데, 리눅스 서버에서는 오류가 발생했다.
2023-01-19 00:04:56,110 INFO [com.nexacro.java.xeni.services.GridExportImportAgent] Input export data : [ Item = grd_main, Seq. = 1, EOF = true, Url = , Inst.Id = ]
2023-01-19 00:04:56,403 INFO [com.nexacro.java.xeni.services.GridExportImportServlet] java.lang.NullPointerException
java.lang.NullPointerException
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
at sun.font.SunFontManager$2.run(SunFontManager.java:441)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:386)
at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
2023-01-19 00:07:25,278 INFO [com.nexacro.java.xeni.services.GridExportImportAgent] Input export data : [ Item = grd_main, Seq. = 1, EOF = true, Url = , Inst.Id = ]
2023-01-19 00:07:25,295 INFO [com.nexacro.java.xeni.services.GridExportImportServlet] java.lang.NullPointerException
java.lang.NullPointerException
at sun.awt.FcFontManager.getDefaultPlatformFont(FcFontManager.java:76)
at sun.font.SunFontManager$2.run(SunFontManager.java:443)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:386)
at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.canDisplayUpTo(Font.java:2064)
at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
at java.awt.font.TextLayout.<init>(TextLayout.java:531)
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273)
at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:88)
at com.nexacro.java.xeni.export.impl.GridExportExcel.executeExport(Unknown Source)
at com.nexacro.java.xeni.services.GridExportImportAgent.gridExport(Unknown Source)
at com.nexacro.java.xeni.services.GridExportImportAgent.gridExport(Unknown Source)
처리방법
- AWT 폰트 시스템이 초기화되면 https://docs.oracle.com/javase/8/docs/technotes/guides 에 설명된 우선 순위에 따라 $JAVA_HOME/lib에서 폰트 구성 파일을 찾는데, 그 구성파일이 없어서 오류가 난다고 한다.
- 근데 WIndows OS에서는 OpenJDK를 사용해도 오류가 나지 않는것 같다. (OS에 폰트가 설치된 경우에는.. OS폰트를 로드하도록 설정이 되어있어서 오류가 나지않는건가?...)
- 결론은 리눅스에서는 fontconfig(폰트설정파일)도 $JAVA_HOME/lib에 만들어주고, urw-fonts 패키지도 설치해주면 된다.
https://github.com/adoptium/adoptium-support/issues/70#issuecomment-458694581
폰트 설정파일 생성
- 일단 WAS에서 바라보고 있는 $JAVA_HOME/lib (여기서는 OpenJDK설치된 폴더에 bin 폴더, .jre/bin 폴더 두군데 다 넣어줬다)에 fontconfig.properties 파일을 만들어 주고 거기에 아래와 같이 입력해준다.
#fontconfig.properties
version=1
sequence.allfonts=default
리눅스 폰트 패키지 설치
- 관리자로 폰트 패키지 설치
sudo yum install urw-fonts
확인
- 서버 내렸다 올리고 다시 테스트 하면 잘된다요.
728x90
반응형