-
잘못된 소스 파일 인코딩으로 인한 메이븐 컴파일 오류기타기술 2011. 7. 6. 19:50메이븐 사용시 간혹 소스 파일에 대한 인코딩이 POM(Project Object Model)파일에 정의된 것과 다르게 저장될 경우 컴파일오류가 발생할 수 있다. 그런데 컴파일 에러 내용이 좀 생뚱 맞아 원인을 찾지 못하고 버벅 거릴 수 있어 팁을 남겨 본다.
예를 들어 POM.xml 파일에 자바 소스 파일과 거타 리소스 파일에 대한 인코딩이 다음과 같이 각각 euc-kr 과 UTF-8로 설정되어 있다고 가정하자.
<build>
...어쩌구 저쩌구..<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.4.1</version><configuration><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.5</source><target>1.5</target><encoding>euc-kr</encoding></configuration></plugin>...어절씨구 저절씨구..</plugins></build>
위와 같은 경우 소스파일이 euc-kr로 인코딩이 되어 있어야 컴파일이 제대로 된다. 그런데 UTF-8나 다른 인코딩 방식으로 소스파일이 저장되어 있을 경우 다음과 같은 컴파일 오류가 발생할 수 있다.
[INFO] ------------------------------------------------------------------------[ERROR] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Compilation failureFailure executing javac, but could not parse the error:An exception has occurred in the compiler (1.6.0_14). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checkingthe Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.java.nio.BufferOverflowExceptionat java.nio.Buffer.nextPutIndex(Buffer.java:495)at java.nio.HeapCharBuffer.put(HeapCharBuffer.java:145)at com.sun.tools.javac.util.DefaultFileManager.decode(DefaultFileManager.java:830)at com.sun.tools.javac.util.DefaultFileManager.access$300(DefaultFileManager.java:76)at com.sun.tools.javac.util.DefaultFileManager$RegularFileObject.getCharContent(DefaultFileManager.java:1353)at com.sun.tools.javac.util.DefaultFileManager$RegularFileObject.getCharContent(DefaultFileManager.java:1252)at com.sun.tools.javac.main.JavaCompiler.readSource(JavaCompiler.java:483)at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:801)at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)at com.sun.tools.javac.main.Main.compile(Main.java:353)at com.sun.tools.javac.main.Main.compile(Main.java:279)at com.sun.tools.javac.main.Main.compile(Main.java:270)at com.sun.tools.javac.Main.compile(Main.java:87)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess(JavacCompiler.java:554)at org.codehaus.plexus.compiler.javac.JavacCompiler.compile(JavacCompiler.java:161)at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:605)at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:128)at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
[INFO] ------------------------------------------------------------------------[INFO] For more information, run Maven with the -e switch[INFO] ------------------------------------------------------------------------[INFO] Total time: 11 seconds[INFO] Finished at: Wed Jul 06 19:03:52 KST 2011[INFO] Final Memory: 21M/254M[INFO] ------------------------------------------------------------------------
이럴 경우, 당황하지 말고 최근에 변경한 소스파일에 인코딩 형식이 잘못되어 있지는 않은지 차근차근 확인하면 문제를 해결할 수 있겠다. 리소스 파일의 경우 인코딩 형식이 틀려도 컴파일 오류는 발생하지 않는다.
'기타기술' 카테고리의 다른 글
도제식 수련 in SW (0) 2011.08.27 EA(Enterprise Architect)와 SVN 연동하기 (0) 2011.08.04 수렴진화, 그리고 좋은 설계 (0) 2011.07.25 개발자는 나이가 들수록 실력이 좋아진다? (3) 2011.07.19 Mysql 서버에서 실행되는 쿼리 분석 (0) 2011.06.27