본문 바로가기

개발

Tomcat WAS 에 외부 라이브러리 JAR, WAR 로딩 테스트

반응형

1. catalina.properties 내의 common_loader 부분에 경로 추가

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar","/home/wasadm/scp"

 

- > 에러발생 org.apache.jasper.JasperException: java.lang.ClassNotFoundException:

 

2. catalina.properties 내의 server.loader 경로 추가

server.loader="/home/wasadm/scp"

 

- > 동일에러 발생

 

3. catalina.properties 내의 server.loader 경로 추가

server.loader=/home/wasadm/scp

 

- > 동일에러 발생

 

4. catalina.properties 내의 shared.loader 경로 추가

shared.loader=/home/wasadm/scp

 

- > 동일에러 발생

 

5. catalina.properties 내의 shared.loader 경로 추가

shared.loader=/home/wasadm/scp/scpdb.jar

Penta SCP API Example

 

java.class.path = /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar

java.library.path = :/home/wasadm/scp:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

 

strInputPlain = 123456-1234567

ScpEncStr = 8C3A4B500A6DCBEF3F9D94FB606108D8

ScpDecStr = 123456-1234567

ScpEncB64 = QF6MOktQCm3L7z+dlPtgYQjY

ScpDecB64 = 123456-1234567

 

정상 출력됨.

 

6. mysql 접속을 위한 경로 추가 catalina.properties

shared.loader=/home/wasadm/scp/scpdb.jar,/home/wasadm/scp/mysql-connector-java-8.0.28.jar

 

기존 scp 가 안되버림.

/home/wasadm/scp/*.jar, /home/wasadm/scp 해도 안됨.

원복해도 기존 SCP가 안됨...

 

7. catalina.properties 의 설정 모두 삭제 후 .bash_profile 부분에 CLASSPATH scp 설치경로 추가

server.loader jar 경로 추가하여도 에러 발생

NoClassDefFoundError 발생

 

8. .bash_profile LD_LIBRARY_PATH scp 설치경로 추가

NoClassDefFoundError 발생

 

9. .bash_profile LD_LIBRARY_PATH scpdb.jar 파일 경로 추가

NoClassDefFoundError 발생

 

10. catalina.sh 내용중 JAVA_OPTS 부분에 -Djava.library.path=/home/wasadm/scp 경로 추가

NoClassDefFoundError 발생

 

11. .bash_profile JAVA_OPTS 추가

export JAVA_OPTS="-Djava.library.path=/home/wasadm/scp"

NoClassDefFoundError 발생

 

12. shared.loader /home/wasadm/scp/*.jar 로 설정

Penta SCP API Example

 

java.class.path = /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar

java.library.path = /home/wasadm/scp

 

strInputPlain = 123456-1234567

ScpEncStr = 8C3A4B500A6DCBEF3F9D94FB606108D8

ScpDecStr = 123456-1234567

ScpEncB64 = QF6MOktQCm3L7z+dlPtgYQjY

ScpDecB64 = 123456-1234567

ScpEncFile = 0

ScpDecFile = 0

ScpHashStr = 0A21743F3E939F23A21127DAB4AA31ECDB3952A2E258A85CB89A9E5583B2B55F

ScpHashB64 = CiF0Pz6TnyOiESfatKox7Ns5UqLiWKhcuJqeVYOytV8=

정상 출력

 

13. 갑자기 UnstaisfiedLinked Error 발생

-> LD_LIBRARY_PATH 추가로 해결

 

-----------------------------------------------------------------------------------------------------------------------------------

 

write_fom.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Write form Page</title>

</head>

<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">

<br> 생성할 아이디와 비밀번호를 입력하세요.<br>

<form name="form1" action="write_DB.jsp" method="post">

        <p> ID: <input type="text" name="id"><br><br>

        Password: <input type="password" name="password"><br><br>

        <input type="submit" name="formbutton1" value="보내기">&nbsp;</p>

</form>

<p>&nbsp;</p>

</body>

</html>

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

write_DB.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Write Database Page</title>

</head>

<body>

<%@ page import = "java.sql.*, java.util.*" %>

<%

String id = request.getParameter("id");

String password = request.getParameter("password");

 

Class.forName("com.mysql.jdbc.Driver");

Connection conn = null;

PreparedStatement pstmt = null;

 

StringBuffer sql = new StringBuffer();

 

try {

        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bless", "root", "root");

        pstmt = conn.prepareStatement("insert into test4 (name, pw) values(?,?) ");

        pstmt.setString(1, id);

        pstmt.setString(2, password);

 

 

        pstmt.executeUpdate();

 

} catch (SQLException e) {

        e.printStackTrace();

} finally {

 

        if(pstmt != null)

                try {

                        pstmt.close();

                } catch (Exception e) {}

        if(conn != null)

                try {

                        conn.close();

                } catch (Exception e) {}

}

ID, Password 가 입력되었습니다.

</body>

</html>

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

read_DB.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Read Database Page</title>

</head>

<body>

<%@ page import = "java.sql.*, java.util.*" %>

<%@ page import="com.penta.scpdb.*" %>

MySQL 데이터 읽기

<%

Class.forName("com.mysql.jdbc.Driver");

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String iniPath     = "/home/scptest/scpdb_agent.ini";

String strInputPlain = "";

String strEnc  = "";

String strDec  = "";

try {

        ScpDbAgent agt = new ScpDbAgent();

        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bless", "root", "root");

        stmt = conn.createStatement();

        rs = stmt.executeQuery("select * from test4");

%>

<br><br>----------------------------------------<br>

<% while(rs.next()) { %>

<br> ID: <%= rs.getString("name") %><br>

<br> Password: <%=rs.getString("pw") %><br>

<%

    strEnc = agt.ScpEncStr( iniPath, "KEY1", rs.getString("pw") );

    System.out.println("[java] ScpEncStr : " + strEnc);

%>

<br> Password(enc): <%=strEnc %><br>

--------------------------------------------<br><br>

<%

}

}catch (SQLException e) { %>

<% e.printStackTrace(); %>

<%

} finally {

        if(rs!=null)

                try {

                        rs.close();

                } catch (SQLException e) {}

        if(stmt!=null)

                try {

                        stmt.close();

                } catch (SQLException e) {}

        if(conn!=null)

                try {

                        conn.close();

                } catch (SQLException e) {}

}

%>

</body>

</html>

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

read_DB.jsp

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

 

write_DB.jsp 암호화 추가

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Write Database Page</title>

</head>

<body>

<%@ page import = "java.sql.*, java.util.*" %>

<%@ page import="com.penta.scpdb.*" %>

<%

String id = request.getParameter("id");

String password = request.getParameter("password");

 

Class.forName("com.mysql.jdbc.Driver");

Connection conn = null;

PreparedStatement pstmt = null;

 

StringBuffer sql = new StringBuffer();

 

try {

        String iniPath     = "/home/wasadm/scp/scpdb_agent.ini";

        ScpDbAgent agt = new ScpDbAgent();

        String strEnc = "";

        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bless", "root", "root");

        pstmt = conn.prepareStatement("insert into test4 (name, pw) values(?,?) ");

        pstmt.setString(1, id);

        strEnc = agt.ScpEncStr( iniPath, "KEY1", password );

        System.out.println("[java] ScpEncStr : " + strEnc);

        pstmt.setString(2, strEnc);

 

 

        pstmt.executeUpdate();

 

} catch (SQLException e) {

        e.printStackTrace();

} finally {

 

        if(pstmt != null)

                try {

                        pstmt.close();

                } catch (Exception e) {}

        if(conn != null)

                try {

                        conn.close();

                } catch (Exception e) {}

}

%>

ID, Password 가 입력되었습니다.

</body>

</html>

 

 

Id/pw penta 기입

 

 

----------------------------------------------------------------------------------------------------------------------------------------------

현재 사용하는 jar 파일은 scpdb.jar, mysql~~~jdbc.jar

두개의 jar 파일을 war 묶음 (test.war 파일로 묶음)

 

catalina.properties *.jar 참조를 주석처리하고 test.war 참조하도록 변경 tomcat 재기동

 

재기동 에러 발생

 

Tomcat server.xml 파일에 war 이름 추가

test.war 파일은 /usr/local/tomcat8/webapps 복사

이후 재기동

 

shared.loader 내용 추가한 shutdown 시 못보던 메시 출력

 

server.xml 내용추가후 기본 시작이 안됨.

server.xml 다음과 같이 수정

 

동일하게 안됨.

 

일단 server.xml 삭제 재기동 후에는 정상적으로 기동됨.

 

catalina.properties 내용 수정 재기동

 

Tomcat 정상적으로 구동되나 samplecode 안됨

 

test.war 파일이 압축 풀어져서 /usr/local/tomcat8/webapps/test 되어있는 확인

 

 

Jsp 소스를 ~~~~/test 경로로 이동 재기동

 

http://152.67.199.138:8080/test/ScpDbSampleCode_Total.jsp

경로로 호출하였으나 에러 발생

 

test.war 그대로 상태에서 catalina.properties shared.loader 부분을 주석처리한 재기동

 

 

동일에러 발생

 

catalina.properties shared.loader 경로에 test.war 파일 해제되는 경로 추가한 재기동 확인

 

 

http://152.67.199.138:8080/test/ScpDbSampleCode_Total.jsp 정상적으로 출력됨.

http://152.67.199.138:8080/ScpDbSampleCode_Total.jsp 정상적으로 출력됨.

db 호출하여 암호화하는 부분 테스트

 

 

DB 데이터 복호화 테스트

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

아마도 결론

  • scpdb.jar 파일을 WAR 묶어서 올릴때는 shared.loader 부분에 war 파일이 압축풀리는 경로

(ex. /usr/local/tomcat8/webapps/test/*.jar) 경로를 넣어주면 해당 war 디렉토리에 jsp 파일이 없더라도 정상적으로 jar 호출을 한다.

 

-----------------------------------------------------------------------------------------------------------------------

추가 테스트

 

/usr/local/tomcat8/webapps/url 이라는 디렉토리를 생성한 모든 jsp 파일 복사

$LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wasadm/scp 설정 제거

이후 재기동

 

정상적으로 호출됨

 

다시 재기동 확인 (정상적으로 호출됨)

 

 

scpdb.jar 파일을 /usr/local/tomcat8/lib 복사 재기동 확인

 

여러 시도하여도 호출

 

/usr/local/tomcat8/webapps/ROOT/WEB-INF 경로에 scpdb.jar 파일을 복사 재기동하여 확인

 

정상적으로 호출 .

 

/usr/local/tomcat8/webapps/url/WEB-INF 경로에 scpdb.jar 파일을 복사 재기동하여 확인

 

호출됨.

 

 

Jar 파일이 위치한 경로들

 

Jar 파일 전체 삭제 재기동

 

 

Jar 파일 삭제 에러 발생

 

test.war 파일이 위치하는 곳에서 test 디렉토리를 삭제한 WAS 재기동

 

해당 디렉토리 삭제 재기동하니 test.war 압축을 다시 해제하여 scpdb.jar 존재하는 확인

 

해당 파일만 있는 상태에서는 에러 발생하지 않고 정상적으로 호출되는 것을 확인함.

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

최종 설정 정보

LD_LIBRARY_PATH .bash_profile 아무런 설정도 하지않음.

 

catalina.properties 파일 server.loader 부분에 WAR 파일 압축 풀어지는 경로의 *.jar 참조하도록 설정

 

WAR 파일 위치 디렉토리 정보

 

scpdb.jar 파일 존재 위치

 

/usr/local/tomcat8/webapps/test/scpdb.jar --> test.war 파일이 WAS 기동되면서 WAR 압축이 해제된 경로

/home/opc/scp/scpdb.jar --> wasadm 계정에 설치하기 위해 파일을 업로드한 공용계정경로

/home/wasadm/scp/scpdb.jar --> 설치경로

반응형

'개발' 카테고리의 다른 글

C# 1 - 변수  (0) 2023.11.06
C# 개발환경 구성  (0) 2023.11.06
Spring start project 에 외부라이브러리 추가 및 구동  (0) 2022.10.21