start.spring.io에서 Jar로 프로젝트를 생성한 이후에 War로 변경하는 방법

 

 

 

위의 이미지처럼 Jar 로 생성했을떄 아래와 같은 build.gradle 이 생성된다.

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.6'
	id 'io.spring.dependency-management' version '1.1.0'
}

... 생략

 

plugins 와 dependencies 에 war 관련 설정을 추가해주자

plugins {
	id 'war'
}


dependencies {
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

 

설정을 변경한 후에 나오는 코끼리 아이콘을 눌러 변경을 적용하면 된다

 

(아이콘이 나오지 않는다면 gradle View 의 [Reload All Gradle Projects] 를 눌러서 적용 가능)

 

 

적용 후의 모습 

정상적으로 적용되면 Gradle view 의  프로젝트명 > Tasks > build 에서 

bootWar, bootWarMainClassName, war 가 추가된걸 확인 할 수 있다.

Toby's spring 공부 도중 해당 Exception 발생

 

java.lang.Exception: Unexpected exception, expected<org.springframework.dao.DataIntegrityViolationException> but was<java.lang.NoClassDefFoundError>
	at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: java.lang.NoClassDefFoundError: org/springframework/dao/DuplicateKeyException
	at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:811)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:867)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:875)
	at springbook.user.dao.UserDaoJdbc.add(UserDaoJdbc.java:86)
	at springbook.test.UserDaoTest.duplicateKey(UserDaoTest.java:135)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:21)
	... 21 more
Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DuplicateKeyException
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	... 37 more

해결 방안

<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.13</version>
</dependency>

추가 

java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable

 

Junit 테스트 중 method 한개만 테스트 할때는 문제 없는데 

class 단위로 테스트 했을때 문제 생기면

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.9.5</version>
</dependency>

 

 

 

@Service
public class TestServiceImpl implements TestService {
	@Override 
    public void testMethod(){
    	// ...
    }
}

 

위와 같이 @Repository 가 아닌 @Service로 등록했음에도 불구하고 Invalid bound statement 로 뜨면서 쿼리문을 못찾는다고 나옴

 

 

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.chris1108.mysite.service.TestService.testMethod
	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:214)
	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)

 

원인은 datasource-context.xml 에 설정했던 MapperScanner 때문 

@Repository 가 등록된 클래스들의 패키지를 확실하게 정하지 않은 상태여서 

실제 repository 들이 있는 com.chris1108.mysite.repository 가 아닌 

상위 패키지(com.chris1108.mysite ) 를 적었더니 해당 패키지에 위치한 @Service 까지도 mapper로 인식해 버리는 문제가 있었음. 

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	  	<property name="basePackage" value="com.chris1108.mysite" />
	</bean>

아래와 같이 변경 후 해결 

	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	  	<property name="basePackage" value="com.chris1108.mysite.repository" />
	</bean>

+ Recent posts