Search

반응형

요즘 딥러닝과 파이썬만 공부하다 오랜만에 자바 스프링 한 번 해보려고 VSCode를 실행했다.

너무 오래되었는지 오류가 났다.

VSCode는 기존에 세팅 방식에서 변한 건 없고 jdk 버전만 올려주니 잘 되었다.

Spring.io에서 STS를 다운 받아서 실행하는데 오류가 난다.

 

오류메시지

오늘 일자로 STS(이클립스 버전) 받았고 jdk17 버전으로 세팅했다.

Spring Web 프로젝트를 Gradle로 생성했다.

그러자 위 오류가 났다.

오류정보 : 'Import Gettiing Started Content' has encountered a problem. ToolchainDownloadFailedException: No locall installed toolchains match and toolchain download repositories have not been configured.

사실 첨 보는 오류였다.

오류 정보도 친절하지 않네. 어이구야.

같은 조건으로 Maven 프로젝트는 문제 없이 잘 된다.

Gradle에서 jdk 버전 체크를 하는 듯 다.

 

해결방법 

jdk17, jdk19로 했더니 계속 오류가 났다.

오늘자로 받은 Spring STS는 최저 jdk 버전이 21부터 시작한다.

1. jdk21 버전을 다운 받는다. (https://jdk.java.net/archive/)

2. 원하는 위치에 압축을 푼다. (예: C:\jdk-21.0.2)

3. 환경설정에서 JAVA_HOME의 jdk 위치를 수정해서 넣어준다.

4. 명령 프롬프트에서 잘 세팅 되었는지 확인한다.

5. Spring STS를 실행하고 상단 Window>Preferences를 클릭한다.

6. Java>Compiler를 선택하고 JDK를 21로 변경 후 Apply(적용)한다.

7. Java>Installed JREs를 선택한 후 21 버전으로 선택 후 apply(적용)을 클릭한다.

8. Spring STS를 종료한다.

9. 원도우 탐색기를 실행해서 Spring STS가 설치된 위치로 이동한다.

10. SpringToolSuite4.ini 파일에 마우스 우클릭을 해서 메모장에서 편집을 클릭한다.

11. -vm을 찾고 그 아래 있던 정보는 지우고 새로 설치한 jdk위치를 포함한 아래 경로를 넣어주고 저장한다.

12. Spring STS를 다시 실행한다.

13. Spring Web Gradle 프로젝트를 생성한다.

 

이제 잘 실행될 것이다.

 

PS. SpringWeb 프로젝트를 생성했지만 Boot Dashboard의 local에 추가가 안되면 프로젝트 생성에 오류가 발생한 것이다. 

프로젝트가 오류 없이 생성되면 아래와 같이 자동으로 프로젝트가 추가된다.

 

이번 포스팅에서 ToolchainDownloadFailedException: No locall installed toolchains match and toolchain download repositories have not been configured.

오류 해결방법에 대해 알아봤다.

삽질은 이제 그만...

 

 

 

 

 

 

 

반응형
반응형

안녕하세요. 신기한 연구소입니다.

최근 새로운 개발 요청을 받았답니다. 우후~

기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하고 있는 구조더군요.

그런데 응답부분은 기존대로  XML을 사용해서 서비스를 제공해야 한다더군요. 흠...

응답해 줄  XML을 구성하고 JSON으로 통신해서 얻은 값을 활용해서 XML로 다시 구성한 후 응답하는 시스템인데 무슨 말인지 복잡하죠? 

우선  자바(JAVA)에서 XML을 다루는 방법을 익히고 업무에 적용하면 쉽게 진행이 될 듯합니다.

기본적인 자바(JAVA)에서  XML 파싱을 먼저 알아봅니다.

참고로 XML 데이터는 총 3가지로 받을 수 있습니다.

다른 시스템에서 응답으로 받았거나 소스 내부에서 문자열(String)로 생성한 경우,

시스템 내부 xml 파일로 존재해서 불러오는 경우,

외부 사이트에서 제공하는 xml 데이터를 URL로 불러오는 경우가 있습니다.

 

1. String 문자열로 된 XML 파싱 예제 확인하기. - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.ByteArrayInputStream;
import java.io.InputStream;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element; 
 
public class XMLSam {
    public static void main(String[] args) throws Exception {
        System.out.println("XML Parsing Sample!");
 
        String sampleXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><customer id=\"cus\"><online><name>고객1</name><age>28</age><gender></gender></online></customer>";
        InputStream is = new ByteArrayInputStream(sampleXML.getBytes("UTF-8"));
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder build = factory.newDocumentBuilder();
        Document doc = build.parse(is);
 
        Element element = doc.getDocumentElement();
 
        System.out.println(element.getAttribute("id"));
 
 
    }
}
cs

위 예제는 문자열로 xml을 활용하는 예제입니다. 문자열로 xml을 만들어 사용할 때는 값에 포함된 "를 반드시 \를 사용해야 합니다. 당연 오류가 나고 실행이 안될 테니까요.

DocumentBuilderFactory  를 사용해서 XML로 구성된 DOM용 파서 생성용 인스턴스인 factory를 만듭니다.

DocumentBuilder  는 XML 문서로부터 DOM 문서용 인스턴스를 얻기 위한 클래스로 factory객체를 통해 생성합니다.  이 인스턴스는 XML로부터 Document 를 얻을 수 있게 해 줍니다. 바로 19번 라인처럼요.

build 객체는 parse 메서드를 가지고 있고 인수로 XML 데이터를 받습니다. 위 예제는 문자열로 만든 XML을 인수로 받는 소스인데 String 문자열을 그대로 받을 수 없고 InputStream 타입으로 ByteArrayInputStream 생성자를 통해 인스턴스를 생성한 뒤 그 인스턴스를 넘기면 됩니다. 혹시 charset의 이슈가 있다면 getBytes("UTF-8") 처럼 원하는 charset을 지정해 주면 오류가 안 납니다.

생성된 문서 doc를 사용해서 XML의 root를 가져온 뒤 해당 root의 "id" 속성을 가져오는 테스트를 진행합니다.

성공적으로 잘 출력이 됩니다.

 

2. XML 파일로 된 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class NomalizeTest {
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
        Element root = document.getDocumentElement();  
 
        System.out.println(root.getAttribute("id"));
    
 
    }
    
}
cs

이번 예제는 XML 파일을 불러와서 파싱 하는 소스입니다. 첫 번째 소스와 거의 같습니다. 14번 라인의 parse의 인수로 InputStream이 아닌 파일 경로를 사용했습니다. 이 경우는 sample.xml 파일을 지정된 위치에 만들어야 합니다.

 

3. URL을 통해 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class Test {
    
 
    public static void main(String[] args) throws Exception {
        System.out.println("START");
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
        DocumentBuilder builder = factory.newDocumentBuilder();
        
        Document document = builder.parse("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108");   
 
        Element root = document.getDocumentElement();
 
        System.out.println(root.getAttribute("version"));  //root 속성값 가져오기
    }
    
}
cs

17라인을 보면 parse의 인수가 url로 되어 있습니다. 기상청 전국 날씨를 XML 형식으로 받을 수 있는 URL입니다. 샘플로 공부하기 좋습니다. 실제 데이터이기에 이 정보를 가지고 사이트 구축 시 활용해도 좋답니다.

컴파일 후 실행하면 정상적으로 결괏값이 나옵니다. version은 "2.0 " 으로 출력됩니다.

지금까지 3가지 방식의  자바(JAVA)에서 XML 데이터를 가져와 파싱 하는 예제를 만들어봤습니다.

자바(JAVA) 에서 XML 데이터의 노드 값, 속성 값, 텍스트 값을 가져오는 방식이 있는데 복잡한 XML 데이터를 잘 분석해서 프로그램으로 만드는 방법을 다음 포스팅에 설명할 예정입니다.

자바(JAVA)의 클래스/인터페이스인 NodeList, Node 를 사용하여 실제 업무에 활용한 소스를 가지고 같이 테스트해 볼 예정이오니 다음 포스팅도 기대해 주세요.궁금하거나 이해가 안 되는 내용은 댓글 주세요.

모두 즐 코딩하세요.

반응형