외부 라이브러리 자바(java) jar 파일 생성 및 실행(vendorName == null!) 에러 해결 :: 개발/일상_Mr.lee

외부 라이브러리 자바(java) jar 파일 생성 및 실행(vendorName == null!) 에러 해결

Posted by Mr.mandu.
2020. 5. 7. 15:07 개발/java,spring

안녕하세요.

오랜만에 자바관련 포스팅을 하려고 합니다.


대부분 자바를 활용하여 개발을할때 이클립스를 사용합니다.

하지만 실행파일을 만든다던지 별도로 실행할수 있는 파일이 필요할 때가 있습니다.


저는 이클립스로 개발을 하고 Jar 파일을 만들어 별도로 실행하려고 합니다.

일반적으로 Runable jar file을 만든다던지 별도의 실행파일을 만드는 블로그의 설명글은 많습니다.

그런데 부 라이브러리를 사용하게될때의 포스팅은 별로 없는것 같았습니다.


실제로 저도 상당한 시간소요를 하게 되었습니다.

아마 JAI를 사용하여 이와같은 에러를 가지고 있는 분들은 상당한 도움이 될것이라 생각합니다.



에러내용

Exception in thread "main" java.util.ServiceConfigurationError: javax.imageio.spi.ImageOutputStreamSpi: Provider com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi could not be instantiated

        at java.util.ServiceLoader.fail(ServiceLoader.java:232)

        at java.util.ServiceLoader.access$100(ServiceLoader.java:185)

        at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:384)

        at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)

        at java.util.ServiceLoader$1.next(ServiceLoader.java:480)

        at javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(IIORegistry.java:210)

        at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:138)

        at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159)

        at javax.imageio.ImageIO.<clinit>(ImageIO.java:66)

        at FileUtil.splitFile_ToPng(FileUtil.java:148)

        at FileUtil.split_multi_tif(FileUtil.java:46)

        at Main.main(Main.java:15)

Caused by: java.lang.IllegalArgumentException: vendorName == null!

        at javax.imageio.spi.IIOServiceProvider.<init>(IIOServiceProvider.java:76)

        at javax.imageio.spi.ImageOutputStreamSpi.<init>(ImageOutputStreamSpi.java:91)

        at com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi.<init>(ChannelImageOutputStreamSpi.java:64)

        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 java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:380)

        ... 9 more



이제 이를 해결해보도록 하겠습니다.

우선 프로젝트를 다음과 같은 구조로 만들겠습니다.



저는 별도로 lib 폴더을 생성하여 라이브러리 파일들을 옮겼습니다.

그리고 META-INF 폴더를 생성하여 MANIFEST.MF 파일을 만들었습니다.

(그냥 TXT 파일 만들어서 확장자를 변경하였습니다.)


그리고 내용을 기재하였습니다.


MANIFEST.MF 내용

Manifest-Version: 1.0

Class-Path: lib/jai_codec-1.1.3.jar lib/jai_core-1.1.2_01.jar lib/jai_imageio-1.1.jar

Main-Class: Main




이제 프로젝트의 우클릭을하여 Export 합니다.




JAR file을 선택합니다.



위의 그림처럼 선택하셔야 합니다.

프로젝트에서 SRC만을 선택하였습니다.

그리고 아래의 옵션 그대로 따라해주세요.



그리고 다음으로 진행하겠습니다.



그리고 여기에서 미리 설정해두었던 MANIFEST.MF를 선택합니다.


그러면 JAR 파일이 만들어 집니다.

그리고 라이브러리 파일도 함께 보관해주세요





실행방법

윈도우 - cmd - JAR 파일 있는곳으로 이동


명령어 실행 : java -jar 파일명.jar


이렇게 실행하면 됩니다.


일반적으로는 굉장히 간다한데 외부 라이브러리가 있어 고생하는 사람이 많을것입니다.

저도 그랬으니깐요..

구글에서...삽질을 굉장히 많이했네요..


그럼 모두 고생하세요!