WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ... >
	<servlet>
		<servlet-name>Servlet that filter forbidden</servlet-name>
		<servlet-class>my.package.ForbiddenServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Servlet that filter forbidden</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
</web-app>

my.package.ForbiddenServlet.java

public class ForbiddenServlet extends HttpServlet {
	public ForbiddenServlet() {
	
	}
	
	public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//		super.service(req, res);
		res.sendError(HttpServletResponse.SC_FORBIDDEN);
	}
}

값 비교를 위해 사용 시

call by value 형태인 equals 사용 필요

== 연산자 사용 시 보유한 값이 동일하더라도 같지 않은 결과가 도출될 수 있음


equals : 값 비교

== : 객체 비교




java -jar 옵션 사용 시 -cp 옵션은 무시됨

(이거 때문에 수많은 구글링을 ㅠㅠ)




첫번째 사용법.


java -cp external_library.jar:runnable.jar package.subpackage.Main


이렇게 사용하면 일단 실행은 가능.

하지만 매번 실행 클래스를 지정해주어야 하는 번거로움이 있음.




두번째 사용법.


특정 경로에 대해 필요한 jar 를 동적으로 로딩

참조 : http://stove99.tistory.com/64


나는 위 URL 의 RuntimeJarLoader.loadJarIndDir 내부에서

특정 문구가 포함된 jar 만 로딩하도록 변경하여 적용하였다.






덧.

첫번째 사용법에 대해 뻘짓하며 열심히 구글링 했는데..

수없이 열어놓은 브라우저 탭을 정리하면서 깨달았다.


https://minchangdev.wordpress.com/2014/04/16/java-jar-%EC%8B%A4%ED%96%89%EC%8B%9C-%EC%99%B8%EB%B6%80-jar-%ED%8C%8C%EC%9D%BC%EC%97%90-%EB%8C%80%ED%95%9C-classpath-%EA%B0%80-%EB%8F%99%EC%9E%91%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4/


이 블로그 글이 첫번째 사용법이랑 동일한 얘기군; ㅠㅠ






+ 추가

classpath 옵션은 줄 수 없지만, 아래와 같은 형태로 진행 가능


java -Djava.library.path=/external/library/directory1 -jar runnable.jar


OS 의 라이브러리 경로 (ex. LD_LIBRARY_PATH) 변경이 필요할 경우에는,

테스트용 script 파일을 만든 뒤 파일 내부에서 아래와 같은 형태로 진행 가능


export LD_LIBRARY_PATH=/external/library/directory1

java -Djava.library.path=/external/library/directory2 -jar runnable.jar


* 위와 같이 설정할 경우 java 코드를 통해 출력해보면 아래와 같다.


Library path (OS) : /external/library/directory1

library Path (Java) : /external/library/directory2


// 메모리 초기화

System.gc();


long useMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

logger.info(String.format("MEMORY USED : %d MB", useMemory/1024/1024));



다른 사람들은 별도의 설정 없어도 정상적으로 메이븐 빌드가 되는데

나의 경우에는 자꾸 package does not exist 에러가 났다.

(여기서 package는 커스텀 패키지로 .jar의 형태)


프로젝트 속성 -> Java Build Path 에 보면,

해당 라이브러리가 Web App Libraries 하위에 포함되어 있음에도 그랬다.


심지어 바로 어제는 Build Path 에 추가해주는 것만으로도 처리 됐는데,

오늘이 되자 이 방법으로는 어떻게 해도 진행 불가.


그래서 [Add JARs...] 를 눌러서 명시적으로 해당 파일을 추가해줘도 마찬가지.


내 개발환경은

* mac air

  - os : el capitan(10.11.6)

* eclipse mars

* spring framework 3.8.1

* maven 은 별도로 설치 하지 않음

  - spring IDE Maven Integration 으로 포함

  - 프로젝트 실행에 이상 없으나 명령줄에서 mvn -version 사용불가

  - 추가 설치(maven : 3.3.9, 연결된 java : 1.8)했으나, 실제 프로젝트 컴파일 시 영향이 있는지는 모르겠음.

* Java Build Path

  - JRE System Library : Java SE 7 (1.7.0_79)

* Java Compiler

  - Compiler comliance level : 1.5

* 구동 환경 : Tomcat 7






구글링 해서 결국 꾸역 꾸역 돌아가는 방법을 찾았다.


pom.xml 파일에


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

<properties>

<!-- 라이브러리 위치 -->

<webapp.lib>${basedir}/src/main/webapp/WEB-INF/lib</webapp.lib>

</properties>


<!-- for Libraries (lib/Libraries.jar) -->

<dependency>

<groupId>whatever</groupId>

<artifactId>whatever</artifactId>

<version> whatever </version>

<scope>system</scope>

<systemPath>${webapp.lib}/Libraries.jar</systemPath>

</dependency>

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


강제로 추가하는 방법으로 clean 및 install 완료하고 war 로 추출하기 성공했다.




...그런데 왜 남들은 이 설정 안해줘도 되는데 나는 안되는건지 모르겠다 -_ㅠ




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


위와 같은 방법으로 진행시, 메이븐 빌드는 가능하다.

하지만 실제로 만들어진 WAR 파일로 배포는 할 수 없다.

서버에 올릴 때 에러가 발생.

어딘가 플러그인이 꼬인 것 같다.


이클립스 마켓플레이스 말고,

Install New Software 에 [ http://m2eclipse.sonatype.org/sites/m2e ] 를 입력해서 나오는

Maven Integration for Eclipse 체크해서 다운로드 중.


이후 과정은 해보고 다시 포스팅....


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


플러그인이 꼬인게 아니라, 역시 설정의 문제였음.


전제 1. 모든 파일은 SVN 에 연결하여 Checkout 하므로 다른 사람들과 동일한 파일을 가지고 있다.

   (pom.xml 등의 파일을 건드려서 처리하면 안 된다.)

전제 2. 프로젝트에서  톰캣 서버를 통해 Run 시킬 때는 이상이 없다. 고로 프로젝트 상 문제는 아니다.

   (=배포(Maven Build)의 문제다.)


위와 같은 추론을 해서 그동안 계속

해당 프로젝트의 Context 메뉴에서 Properties 쪽 문제일 것 같아 살펴봤는데


* Deployment Assembly

: 경로들에 문제는 없으나, [pom.xml (우클릭) ㅡ Maven ㅡ Update Project..] 진행한 경우 목록에 [Maven Dependencies] 가 보이지 않을 수 있음.

=> [Add ㅡ Java Build Path Entries (Next) ㅡ Maven Dependencies (Finish)] 하여 처리


* Java Build Path

- Tomcat 7.0 바운딩 완료

  : Unbound 이면 더블 클릭 또는 [Edit...] 를 눌러 연결

- JRE System Library [Java SE 7 (1.7.9_79)] 바운딩 완료

  : Unbound 혹은 다른 버전이면 더블클릭 또는 [Edit...] 를 누르고 Alternate JRE 에서 명시적으로 지정, [Installed JREs...] 버튼을 눌러 선택한 것과 동일한 JRE 선택 후 [Apply] 및 [OK] 


* Java Complier

: 실제 배포될 자바 버전을 선택. (필자는 1.5)


* Server

: 서버 목록이 비어있다면, Servers 윈도우에서 [우클릭 ㅡ New ㅡ Server] 로 추가 가능


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


But...


위 목록들 전부 이상이 없었다.

더이상 커스텀 할 무언가도 없는데 뭐가 문제인가.....


구글링을 한 결과....


(대부분 pom.xml을 바꾸는 문서라 찾기가 엄청 어려웠지만)


JRE System Library 에 외부 라이브러리를 추가 해줄 수 있다.


[ Java Build Path ㅡ JRE System Library (Edit...) ㅡ Installed JREs... ㅡ (자바 버전 선택 후) ㅡ Edit... ]

로 들어가서 해당 언어에 속하는 라이브러리를 선택할 수 있는 것.


[ Add External JARs... ] 버튼을 눌러 WEB-INF/lib 안에 있는 커스텀(혹은 3rd party) 라이브러리를 추가한 후 [ Finish ㅡ Apply ㅡ OK ㅡ Finish ㅡ Apply ] 를 순서대로 눌러 프로젝트 속성 창을 닫고


프로젝트 클린 및 빌드, 메이븐 클린 및 패키지(혹은 인스톨) 하면, 타겟 폴더에 드디어 WAR 가 추출된다!!!!!!!!!!



성공!!!!!!!!!!!!!

+ Recent posts