2017-10-23 32 views
3

필자는 필요에 따라 플러그인 v3.7.0 및 JDK 9.0.1을 사용하고 있습니다. 두 개의 requires 문을 추가했습니다. 각 문은 클래스 경로 (자동 모듈)의 jar를 나타냅니다. jar 파일을 Modulepath로 이동 한 후 module-info.java가 Eclipse에서 성공적으로 컴파일됩니다. 그러나, 메이븐 (Maven)은 그들 중 하나가 누락되었다고 말하는 컴파일러 에러를 낸다. (이상하게도, 처음에는 한 줄만 쓰는 것이 아니다.) 자동 모듈 이름을 확인하려고했지만이 병에 대한 명령에서 오류가 발생합니다. 이 오류는 무엇을 의미하며 올바른 모듈 이름을 찾을 수 있도록 수정해야합니까?module-info.java 컴파일이 실패합니다. maven-compiler-plugin 및 자동 모듈

아래의 출력에서 ​​내 사용자 이름을 바꿨습니다. 문제의 항아리는 ServiceLoader를 사용하지 않습니다하지만 자바 9.

computerName:Commander-java username$ jar --file=/Users/username/.m2/repository/com/username/rcf/1.0/rcf-1.0.jar --describe-module 
Unable to derive module descriptor for: /Users/username/.m2/repository/com/username/rcf/1.0/rcf-1.0.jar 
Provider class com.username.rcf.server.TestCmdChain not in module 

computerName:Commander-java username$ java -p /Users/username/.m2/repository/com/username/rcf/1.0/rcf-1.0.jar --list-modules 
Error occurred during initialization of boot layer 
java.lang.module.FindException: Unable to derive module descriptor for /Users/username/.m2/repository/com/username/rcf/1.0/rcf-1.0.jar 
Caused by: java.lang.module.InvalidModuleDescriptorException: Provider class com.username.rcf.server.TestCmdChain not in module 

How to deal with java keywords in auto generated module names in Java 9?의 대답은 모듈 이름에서 Java 식별자의 사용과 관련된 다른 오류가 컴파일되지 않습니다. 항아리 이름이 rcf-1.0.jar이므로 내 모듈의 자동 항아리 이름은 rcf이어야합니다. 내가 얻는 오류도 다르다. 모듈 정보를 도출하는 동안

+0

[Java 9에서 자동 생성 모듈 이름의 Java 키워드 처리 방법] (https://stackoverflow.com/questions/46501388/how-to-deal-with-java-keywords-in- 자동 생성 모듈 이름 - 자바 9) ... \t 유물'rcf-1.0.jar'을 소유하고 있습니까? – nullpointer

+0

예 전 소유하고 있습니다. 이름에 자바 식별자가 없습니다. 그냥 rcf입니다. 이 오류는 ServiceLoader와 관련이있는 것처럼 보입니다. 오류에서 언급 한 클래스가 ServiceLoader와 함께 사용되는 인터페이스를 구현하지만 확실하지 않기 때문입니다. 그것을 이해할 수 없습니다. – GabeV

+1

중복 된 투표가 철회되었습니다. 나중에 구현 패키지 [모듈에 상주하지 않는 것] (https://stackoverflow.com/a/46881513/1746118) 자체처럼 보입니다. – nullpointer

답변

4

어떤 META-INF/services 설정 파일의 내용 provides 선언에 매핑된다.

서비스에 대해 검사 된 패키지는 클래스 파일을 포함하고 있습니다.

또한 개별 클래스의 패키지 이름은 정규화 된 이름에서 파생됩니다. 공유 로그에서 com.username.rcf.server가 제공 될 수있는 서비스에 대한 기대 패키지 이름이어야하며

provides x.y.z.TestCmdChainInterface with com.username.rcf.server.TestCmdChain 

가 모듈에 존재하는 이러한 패키지 com.username.rcf.server이없는 것 같아요으로이 설정된다.