Jenkins + SVN + Maven + Tomcat


jenkins-ci.org 에 들어가서 .war 파일을 다운받는다.


모두 다운받은뒤 Tomcat 설치경로 > webapps 안에 집어넣는다.


tomcat/conf/tomcat-users.xml 을 수정한다.


<tomcat-users>

  <role rolename="manager-gui"/>

  <role rolename="manager-script"/>

  <role rolename="manager-jmx"/>

  <role rolename="manager-status"/>

  <role rolename="admin-gui"/>

  <role rolename="admin-script"/>

  <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>

</tomcat-users>


내용 삽입

저장하고, 톰캣 서비스를 재시작한다.

원래 하던 프로젝트가 있어서 처음은 대충 넘어갔으니 알아서 첫페이지 판단.


jenkins 관리 > 플러그인 관리



현재 설치 가능한 플러그인들을 보여준다.

필터로 검색가능


잘기억나지 않지만

Deploy to container Plugin  -  빌드 후 서버에 자동으로 deploy (tomcat 서비스를 재시작할 필요가없다.)

Maven Project Plugin, Subversion Plugin 은 깔려있었는지 깔았는지 기억나지않지만 

없다면 설치해야됨.


새로운 프로젝트를 생성한다.



Maven 프로젝트라면 당연 Build a maven2/3 project를 선택


Subversion 선택 > repository url 자신의 SVN주소를 적어 넣는다.


적어 넣으면 아래와 같은 에러가 뜨는데

Add 를 누른다.

SVN 계정 및 비밀번호를 입력한다.


그러면 박스 안에 계정명이 뜰것이다.



Build 고급 누르면 이런저런 셋팅이 나오는데

user private maven repository 프로젝트를 하나만 관리한다면

기본 m2.repository 를 사용하면 되지만 프로젝트간에 라이브러리 충돌이 나는경우가

아주 종종있기 때문에 난 workspace 로 잡아주었다.




위의 설정은 자동 배포를 위한 설정이다.

goals and options 에

clean install 을 적어준다.

그후 빌드후 조치를 누르면

deploy war/ear to a container

항목이 뜨는데

위처럼 설정해주고

context path 는 자신의 주소를 적어준다.

tomcat url 도 마찬가지

메니저 user name 는 아까 tomcat / conf / tomcat-users 에서 설정해준 계정명과 pw

저장을 누르고 사이드 메뉴를 보면 build now 가 있다 

Build now 를 누르면 build history에 프로그래스바가 진행된다.

안되는 경우는 에러를 참조하여 구글링을 한다.

pom.xml 을 못 끌어오거나 무언가 에러가있을때 안됨 간혹



진행중인 프로그래스 바를 클릭하면 페이지가 바뀐다.


console output 를 눌러 콘솔에서 진행중인 내용을 확인하자



뭐 많이 뜰것이다 어쩌고 저쩌고 build 내용 및 라이브러리 내용물들이 뜨는데 처음엔 maven 라이브러리를 가져오느라 첫번째 빌드때 느리다 , 그후 는 빠름



success 가 떨어젔다면 끝 나머지는 콘솔의 로그 내용을 보고 수정을 하든 고치든 하자.


#Tip 이 있는데 서버가 정상적으로 올라가고 쿼리 동작부분에 500에러 mapped contain 어쩌고 에러가뜰경우 xml의 경로를 확인하자.

이것때문에 개삽질 한번 했다.

war에서 .class파일을 배포할때 xml은 자동으로 배포하지 않는 모양이다.

(package 안에 java파일과 xml을 같이 두는경우 아주 간혹있다.)

그런경우 mybatis 설정에서 MapperLocation 을 잡아주고

xml을 분리하여 재배포 하면 정상적으로 아주 잘 작동한다.





게시물에 "New" 같은거 달기

<%@page import="java.util.Calendar"%>
<%@page import="java.util.Date"%>
		<%
			Calendar forBoardMarkercal = Calendar.getInstance();
			forBoardMarkercal.add(Calendar.DATE, -7);
			forBoardMarkercal.setTime(new Date());
			 int forBoardMarkerYear = forBoardMarkercal.get(Calendar.YEAR);
			 int forBoardMarkerTempMonth = forBoardMarkercal.get(Calendar.MONTH)+1;
			 String forBoardMarkerMonth = null;
			 if(forBoardMarkerTempMonth < 10){
				 forBoardMarkerMonth = "0"+forBoardMarkerTempMonth;
			 }else{
				 forBoardMarkerMonth = ""+forBoardMarkerTempMonth;
			 };
			 int forBoardMarkerTempDate = forBoardMarkercal.get(Calendar.DATE);
			 String forBoardMarkerDate = null;
			 if(forBoardMarkerTempDate < 10){
				 forBoardMarkerDate = "0"+forBoardMarkerTempDate;
			 }else{
				 forBoardMarkerDate = ""+forBoardMarkerTempDate;
			 };
		%>

--html
<%=forBoardMarkerYear%><%=forBoardMarkerMonth%><%=forBoardMarkerDate%>
${fn:substring(list.regDate,0,4)}${fn:substring(list.regDate,5,7)}${fn:substring(list.regDate,8,10)}
						    
						    	"새글"	
						    
JSP Calender yyyy:mm:dd 형식 "0"+ 을 안붙이면 그냥 YYYY:M:D 이렇게나옴. 나름대로 의 해결방안


xml 기상청 날씨 파싱

   
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="java.util.List" %>
<%@page import="java.net.URL" %>
<%@page import="org.jdom.Document" %>
<%@page import="org.jdom.Element" %>
<%@page import="org.jdom.input.SAXBuilder" %>
<%@page import="org.xml.sax.*" %>
<%@page import="java.text.*" %>







<%
 List list = null;
 try
 {
  SAXBuilder parser = new SAXBuilder();
  parser.setValidation(false);
  parser.setIgnoringElementContentWhitespace(true);
  URL url = new URL("http://www.kma.go.kr/wid/queryDFS.jsp?gridx=59&gridy=125");
  InputSource is = new InputSource(url.openStream());
  Document doc = parser.build(is);
  Element root = doc.getRootElement();

  Element channel = root.getChild("body");
  list = channel.getChildren("data");
%>
<%
   Element el = (Element)list.get(0);
 %>
 
   
  • ---------------------------------
  • 시간:<%=el.getChildText("hour")%>시
  • 현재온도:<%=el.getChildText("temp")%>℃
  • 최고온도:<%=el.getChildText("tmx")%>℃
  • 최저온도:<%=el.getChildText("tmn")%>℃
  • 날씨:<%=el.getChildText("wfKor")%>
  • 강수확률:<%=el.getChildText("pop")%>%
  • 습도:<%=el.getChildText("reh")%>%
  • ---------------------------------


  • <% }catch(Exception e){ e.getStackTrace(); }


    이클립스 디컴파일

    스트래티지 패턴(Strategy Pattern)






    스트래티지 패턴(Strategy pattern) 에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
    스트래티지를 활용하면 알고리짐을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할수있다.


    package org.acounta.strategy;
    public abstract class Duck {
     FlyBehavior flyBehavior;
     QuackBehavior quackbehavior;

     public Duck() {
     }
     public abstract void display();

     public void performFly() {
      flyBehavior.fly();
     }
     public void performQuack(){
      quackbehavior.quack();
     }

     public void swim(){
      System.out.println("모든 오리는 물에 뜸");
     }

    }

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

    package org.acounta.strategy;

    public interface FlyBehavior {

     void fly();

    }

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

    package org.acounta.strategy;

    public class FlyNoWay implements FlyBehavior {

     @Override
     public void fly() {
      System.out.println("i'm not flying");
     }

    }

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

    package org.acounta.strategy;

    public class FlyWithWings implements FlyBehavior {

     @Override
     public void fly() {
      System.out.println("i'm flying");
     }

    }


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

    package org.acounta.strategy;

    public class MallardDuck extends Duck {
     public MallardDuck(){
      quackbehavior = new Quack();
      flyBehavior = new FlyWithWings();
     }
     
     @Override
     public void display() {
      System.out.println("i'm water duck");
     }

    }

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

    package org.acounta.strategy;

    public class MuteQuack implements QuackBehavior {

     @Override
     public void quack() {
      System.out.println("닥쳐!");
     }

    }

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

    package org.acounta.strategy;

    public class Quack implements QuackBehavior {

     @Override
     public void quack() {

      System.out.println("Quack");
     }

    }


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

    package org.acounta.strategy;

    public interface QuackBehavior {

     void quack();

    }

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

    package org.acounta.strategy;

    public class Squack implements QuackBehavior {

     @Override
     public void quack() {
      System.out.println("삑");
     }

    }
    ----------------------------------------------------------------

    package org.acounta.strategy;

    public class AcountaTestMain{
     public static void main(String[] args) {
      Duck mallard = new MallardDuck();
      mallard.performFly();
      mallard.performQuack();
      mallard.swim();
     }
    }

    i'm flying
    Quack
    모든 오리는 물에 뜸