Spring2019. 10. 8. 14:49

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

 

Spring Boot에서 hamcrest를 이용해서 테스트시 위와 같은 에러가 발생할 때가 있다.

구글링을 하면 대부분 Build Path 순서를 바꾸라고 나오고, 가끔 이클립스의 jar가 예전버전이라서 새 버전을 받아서 plugin 폴더의 jar를 교체하라는 말도 나온다.

 

그런데 Spring Boot의 경우 pom.xml에 직접 junit 관련 jar를 기입한 것이 아닌 자동으로 삽입된 것이고,

지금 사용하는 이클립스도 2019-03 버전이라서 hamcrest jar가 예전 것이라는 말도 맞지 않았다.

 

결국 찾은 것은 이클립스안에 junt관련 jar가 내장되어있으니 Java Build Path에서 Junit 라이브러리를 제거하는 것이다.

메이븐 라이브러리에도 junit과 hamcrest가 들어있는데 따로 Junit 라이브러리도 추가하니 중복으로 기입되면서 pom.xml에서 jar 순서가 바뀐 것과 같은 효과가 발생한 것이다.

 

알고 보면 쉬운데 모르면 고생하고, 당황하지 말고 침착하게 찾아보는 것이 답이다.

 

참고 : http://wangxiangblog.blogspot.com/2015/10/spring-boot-mockito-spring-rest-junit.html

'Spring' 카테고리의 다른 글

Spring Boot + Task Scheduler  (3) 2015.08.24
Posted by net4all
Spring2015. 8. 24. 14:23

Spring framework를 쓰기 위해 복잡한 설정을 할 필요없이 관례적으로 쓰는 기본 설정을 써서 바로 개발에 들어갈 수 있는 Spring Boot를 보다가 Task scheduler도 그대로 이용할 수 있지 않을까 해서 돌려봤습니다.


이제까지 XML 설정없이 annotation으로만 다른 기능들은 돌아갔기에 스케쥴링도 어노테이션만 추가해 보았습니다.


@Scheduled(fixedRate = 5000)


이거 하나만으로 돌아간다면 대박인데, 그렇게 쉽게는 안 돌아가더군요^^


메인 클래스에 @EnableScheduling 어노테이션 붙여줘야 스케쥴링 작동. 

* 참고사이트 : http://spring.io/guides/gs/scheduling-tasks/




@Component

public class ScheduledTasks {


     private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 5000)

public void reportCurrentTime(){

System.out.println("[fixedRate]The time is now " + dateFormat.format(new Date()));

}


}




그러던 스케쥴링 특성상 운영 초기에는 스케쥴링 시간 변경 빈도가 높을 수 있는데, 그때마다 빌드하면 불편한 점이 많습니다.


스케쥴링 시간 설정은 XML에서 하는 것이 변경이 용이하기에 스프링 부트에선 어떻게 XML로 따로 설정하는지 찾아봤습니다.


아래와 같이 @ImportResource 어노테이션 붙여주면 해당 파일에서 설정가능했습니다.




@SpringBootApplication

@EnableScheduling

@ImportResource("/tasks.xml")

public class Application {

public static void main(String[] args) throws Exception{

SpringApplication.run(Application.class, args);

}


}



tasks.xml


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:task="http://www.springframework.org/schema/task"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">


<task:scheduled-tasks scheduler="myScheduler">

        <task:scheduled ref="myBean" method="reportCurrentTime" fixed-delay="5000" />

        <task:scheduled ref="myBean" method="reportCurrentTime2" cron="0 2 * * * *" />

    </task:scheduled-tasks>

 

    <task:scheduler id="myScheduler"/>

</beans>





스케쥴 설정의 reference를 연결하기 위해서 컴퍼넌트 이름 정해주고 @Scheduled 어노테이션을 제거하기만 하면 XML 설정대로 돌아갑니다.


@Component("myBean")

public class ScheduledTasks {


private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

public void reportCurrentTime(){

System.out.println("[fixedRate]The time is now " + dateFormat.format(new Date()));

}

public void reportCurrentTime2(){

System.out.println("[Cron]The time is now " + dateFormat.format(new Date()));

}

}









Posted by net4all