2016-12-07 8 views
1

의 버전 4.2.2에 따라 달라지는 라이브러리 oshi을 사용하는 다중 프로젝트 응용 프로그램이 있습니다. 프로젝트 자체에서는 아직 출시되지 않은 4.3.0을 사용합니다. 우리는 출시 될 때 4.3.0에 기여할 것이지만, 지금 당장 필요합니다. 그래서 우리는 현재 스스로 구축 한 갈래 버전을 사용합니다.작동중인 응용 프로그램에 대해 동일한 종속성의 여러 버전 음영 처리

우리는 maven shade 플러그인을 사용하여 모든 것을 패키지화합니다. 현재 shade plugin은 uberjar에서 4.3.0을 사용합니다.

oshi는 4.2.2에서 4.3.0에없는 것처럼 보이는 함수를 사용합니다. 우리가 사용하고있는 인터페이스가 변경되었고 이제 NoSuchMethodError 예외가 발생합니다. 예외는 다음과 같습니다.

org.quartz.JobExecutionException: org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT;] 
at org.quartz.core.JobRunShell.run(JobRunShell.java:218) [quartz-2.2.3.jar:?] 
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.3.jar:?] 

Caused by: org.quartz.SchedulerException: Job threw an unhandled exception. 
at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-2.2.3.jar:?] 
... 1 more 
Caused by: java.lang.NoSuchMethodError: com.sun.jna.platform.win32.OleAuto.VariantClear(Lcom/sun/jna/Pointer;)Lcom/sun/jna/platform/win32/WinNT$HRESULT; 
at oshi.util.platform.windows.WmiUtil.enumerateProperties(WmiUtil.java:504) ~[oshi-core-3.2.jar:3.2] 
at oshi.util.platform.windows.WmiUtil.queryWMI(WmiUtil.java:304) ~[oshi-core-3.2.jar:3.2] 
at oshi.util.platform.windows.WmiUtil.selectUint32sFrom(WmiUtil.java:112) ~[oshi-core-3.2.jar:3.2] 
at oshi.hardware.platform.windows.WindowsGlobalMemory.updateSwap(WindowsGlobalMemory.java:74) ~[oshi-core-3.2.jar:3.2] 
at oshi.hardware.common.AbstractGlobalMemory.getSwapTotal(AbstractGlobalMemory.java:82) ~[oshi-core-3.2.jar:3.2] 

그래서 내가해야 할 일은 두 버전을 모두 uberjar에 저장하는 방법입니다.

나는 relocating 4.3.0 버전을 사용해 보았지만 작동하지 않는 것 같습니다 (클래스는 uberjar에 없었습니다). 나아가서 나는 이전에 읽은 것을 맹세한다. (그러나 지금은 그것을 찾을 수 없다) 재배치 필드의 패턴은 버전에 대한 옵션이없는 groupId:artifactId[:type][:classifier]이다.

내 종속성 트리의 관련 부분은 다음과 같습니다

myproject 
+-oshi-core 
| +- jna 4.2.2 
+-jna 4.3.0-CUSTOM 

사람이 나에게이 문제를 해결하는 방법에 대한 제안을 줄 수 있습니까? 감사합니다.

+0

다른 사람에게? 아니면 그게 정확히 무슨 뜻입니까? 또한 당신은 결국 pom에서'oshi'와 커스터마이징 된'JNA'로 끝내는 최소한의 의존성을 공유 할 수 있습니다. – nullpointer

+0

응답으로 질문을 업데이트했습니다. –

+0

이 두 가지 구현이 서로 충돌하는 경우 왜 이러한 경우 두 가지 종속성을 모두 사용하겠습니까? – nullpointer

답변

0

은 무엇 당신이 찾고있는 아마 documented here

물론

, <includes>이 유물의 화이트리스트를 지정할뿐만 아니라 사용할 수 있습니다로 받는다는 그늘 - 플러그인의 <includes> 구현입니다. 아티팩트는 groupId:artifactId[[:type]:classifier] 형식의 복합 idenitifer로 표시됩니다. 플러그인 버전 1.3 이후에는 와일드 카드 문자 '*'및 '?' glob과 같은 패턴 이 일치하는 데 사용될 수 있습니다.

선택한 의존성에서 클래스가 포함되어있는 세밀한 제어를 위해

는 유물 필터를 사용할 수 있습니다

예를 들어, 당신이 하나 개의 모듈에서 항아리를 이동 의미합니까 재배치하여

<configuration> 
    <filters> 
     <filter> 
      <artifact>com.github.dblock:oshi-core</artifact> 
      <includes> 
       <include><!--some package you want to include here--></include> 
      </includes> 
     </filter> 
     <filter> 
      <artifact>net.java.dev.jna:jna</artifact> 
      <includes> 
       <include><!--the package from 4.2.0 you want to keep--></include> 
      </includes> 
      </filter> 
     </filters> 
</configuration> 
+0

이 문제는 종속성을 포함하지는 않지만 uberjar의 종속성 클래스 파일은 ./net/java/dev/jna/ 디렉토리에 저장됩니다. 버전을 지정하는 방법이 없으므로 클래스 파일의 이름이 같으므로 마지막으로 쓴 날짜가됩니다. 무엇이 가치있는 일인지 모든 것을 깨뜨린 변화는 여기에있는 것 같습니다 : https://github.com/java-native-access/jna/commit/61bd36b0d05d18008377cd9d0bebe0c794f86296 –