2017-11-02 2 views
0

내 응용 프로그램은 "typesafe.config"를 사용하여 설정을 구문 분석 한 다음 Config 개체를 "ficus"를 사용하여 사례 클래스의 인스턴스로 변환합니다. 사례 클래스에는 현재 19 개의 생성자 인수가 있습니다. 모든 것이 정상적으로 작동합니다.케이스 클래스에 새 필드를 추가하려고하면 Ficus가 예외를 던지는 이유는 무엇입니까?

An exception or error caused a run to abort: MyCaseClass.<init>(Ljava/lang/String;Lscala/Option;Lscala/Option;IZLscala/collection/Seq;Ljava/lang/String;ILscala/concurrent/duration/FiniteDuration;ZLscala/Option;Lscala/Option;ILscala/Option;Lscala/concurrent/duration/FiniteDuration;Ljava/lang/String;Ljava/lang/String;II)V 
java.lang.NoSuchMethodError: MyCaseClass.<init>(Ljava/lang/String;Lscala/Option;Lscala/Option;IZLscala/collection/Seq;Ljava/lang/String;ILscala/concurrent/duration/FiniteDuration;ZLscala/Option;Lscala/Option;ILscala/Option;Lscala/concurrent/duration/FiniteDuration;Ljava/lang/String;Ljava/lang/String;II)V 

내가 "typesafe.config"를 볼 수 있습니다 올바르게에 내 새 필드를 구문 분석 : 내 "settings.conf"에 새로운 인수하고 새로운 해당 필드를 추가 할 때, 나는 다음과 같은 예외를 얻을 Config 개체 그러나 ficus는이 예외를 throw합니다. 새 필드와 새 사례 클래스 생성자 인수는 정확히 동일한 이름을 갖습니다.

이것이 일어날 수있는 이유는 무엇입니까?

구체적인 문제는 다음 커밋에 설명되어 있습니다 :

1) https://github.com/ceilican/Scorex/commit/133157a6ad070cad7a57624c511ee917133ed5f1

2) https://github.com/ceilican/Scorex/commit/074e0bc5add3c666b0943497a5579f3fd365084d

3) https://github.com/ceilican/Scorex/commit/7c8d3475377a17b2a5383bf3a99d797650ca8bc3

처음 두 커밋 노력하고 있습니다. 세 번째 클래스에서는 위에서 언급 한 예외가 발생합니다.

커밋 2와 3에는 개념적 차이가별로 없습니다. 왜 커밋 2가 작동하는지 이해할 수 없지만 커밋 3은 그렇지 않습니다.

내가 때문에 경우 클래스의 인수의 많은이 될 수 있다고 생각 잠시

하지만, 나는 작은 경우 클래스에 새로운 필드를 추가하는 경우에도 문제가 발생하는 것을 알 수 커밋 다음

4) I 후 4

이 무화과 나무속의 버그를 커밋 코드를 실행하려고하면 https://github.com/ceilican/Scorex/commit/1c253b2b526db1539fa674069232cf02784c4bfb

예외의 같은 종류의

가 발생?

답변

0

주 프로젝트 및 하위 프로젝트에서 sbt clean을 수행 한 후 문제가 발생하지 않았습니다. 필자의 추측에 따르면 Ficus의 매크로 마술은 사례 클래스를 기반으로 함수를 생성하지만 사례 클래스가 수정되면 다시 생성되지 않습니다. 그런 다음 Ficus가 새 사례 클래스와 호환되지 않는 오래된 함수를 사용하려고하면 예외가 발생합니다.

흥미롭게도 "중첩 된"사례 클래스를 수정할 때만 재 생성이 이루어지지 않습니다. 설정 파일 인 경우 :

main { 
    nested { 
    param: 0 
    } 
} 

클래스 케이스 : 다음

case class MainCaseClass(nested: NestedCaseClass) 

case class NestedCaseClass(param: Int) 

, MainCaseClass 수정하면 문제가 발생하지 않지만, NestedCaseClass 수정한다.