오늘 이노무것 땜에 스트레스 좀 받았다. 조금만 로그를 자세히 봤었으면 좋았을것을..^^;;

디렉토리 기반으로 배포하도록 Context 를 server.xml 에 추가했는데 자꾸 아래와 같이 에러가 떨어지더라..

2010. 2. 10 오전 12:43:22 org.apache.catalina.core.AprLifecycleListener init
정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/jdk1.6.0_18/jre/lib/amd64/server:/usr/local/jdk1.6.0_18/jre/lib/amd64:/usr/local/jdk1.6.0_18/jre/../lib/amd64:/lib:/usr/lib:/usr/local/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2010. 2. 10 오전 12:43:22 org.apache.tomcat.util.digester.SetPropertiesRule begin
경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'docbase' to '/home/was/sample/simple' did not find a matching property.
2010. 2. 10 오전 12:43:23 org.apache.coyote.http11.Http11Protocol init
정보: Initializing Coyote HTTP/1.1 on http-8080
2010. 2. 10 오전 12:43:23 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 864 ms
2010. 2. 10 오전 12:43:23 org.apache.catalina.core.StandardService start
정보: Starting service Catalina
2010. 2. 10 오전 12:43:23 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/6.0.24
2010. 2. 10 오전 12:43:23 org.apache.catalina.core.StandardContext resourcesStart
심각: Error starting static Resources
java.lang.IllegalArgumentException: Document base /home/was/apache-tomcat-6.0.24/webapps/simple does not exist or is not a readable directory
        at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142)
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4086)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4255)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:516)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:593)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)


처음에는, "왜자꾸 TOMCAT_HOME/webapps 에서 Context 를 로드하려고 하니 얘가.. docbase 도 세팅해줬는데.." 했건만, 결론은, server.xml 에 대소문자 하나때문에 일어난 일이었다..

<Context displayName="simple" docbase="/home/was/sample/simple"
      path="/simple" workDir="" reloadable="true"/>

저 docbase 가 잘못되었었다.. docbase 가 아니고 docBase 인데.. 이런 실수를..ㅜㅜ



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
1. 백업

svnadmin dump %REPODIR% > %REPOBACKUP%

2. 복원

svnadmin load %REPODIR% < %REPOBACKUP%

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

SVN 은 CVS 와 다르게, 기본 설정이, Anonymous 사용자에게 모든 권한이 주어진다.
아래 방법대로 계정을 추가하고, 인증 방식을 설정한다

1. 계정 추가하기

계정은 <CVS REPOSITORY>/conf/passwd 파일에 쓰면 된다.
 [users]
 # harry = harryssecre
 # sally = sallyssecre
user1 = password1
user2 = password2

와 같이, 계정 = 패스워드 방식으로 [users] 섹션에 선언하면 된다.

2. 인증 사용하도록 설정

위와같이 계정만 추가한다고 인증이 실행되는게 아니라, <CVS REPOSITORY>/conf/svnserve.conf 파일을 수정해줘야 한다

[general]
anon-access = none
auth-access = write
..
password-db = passwd
..
realm = Study Codes Repository for Joon
..


위와 같이 설정하도록 한다.
다 이해 갈 것이고, realm 은 인증 시에 사용자에게 보여질 인증 메세지 이다
보통, 현재 Repository 의 설명 정도를 넣어주면 되겠다.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 First of all, there are good link collection page on the internet, so that you can refer to those linked pages for installation of CVS and CVS Server Daemon on each Linux Machines.

CASE 1 : Install CVS using apt-get and xInetd

1. Use apt-get to install CVS.
$ apt-get install cvs

2. Make an account for cvs repository management if possible.
$ useradd -m -G dev srcmanager
$ passwd srcmanager
$ su - srcmanager

3. make a directory for cvs repository and initialize it to serve as cvs repository
$ mkdir cvs_repository
$ chmod g+s cvs_repository
$ cvs -d :local:/home/srcmanager/cvs_repository init

4. Create a xinetd service file as follow and name it to "cvs_pserver". (do this under su privilege)
service cvspserver
{
        socket_type     = stream
        wait            = no
        user            = root
        group           = cvsuser
        env             = HOME=/home/srcmanager/cvs_repository
        server          = /usr/bin/cvs
        server_args     = -f --allow-root=/home/srcmanager/cvs_repository pserver
        disable         = no
}

5. restart xinetd
$ invoke-rc.d xinetd restart

6. check if cvspserver service port (2401) is listening well
$ netstat -an | grep 2401

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Redhat 의 ntsysv 같은 툴을 원하면, ubuntu 에서는 rcconf 설치해서 사용하도록 한다.


그런데, 위의 rcconf 보다 좀더 기능이 있는것이 sysv-rc-conf 이다.
아래 처럼, Runlevel 별로 rc.d 의 config 설정이 가능하다
또한, 바로 서비스를 start / stop 할 수도 있다.






반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

1. 자신의 hostname 을 확인해 봅니다.
초기에 설정을 안하고 기본값으로 설치 하신분들은 ubuntu로 되어 있을 겁니다.
windpyj@ubuntu:~$ hostname
ubuntu


2. /etc/hostname 파일을 열어보시면 다음과 같이 되어 있을 겁니다.
windpyj@ubuntu:~$ sudo vi /etc/hostname

ubuntu


3. 변경하고자 하는 hostname을 넣어주고 저장하시면 됩니다.

#ubuntu 기존것은 주석처리 하였습니다.

servermaster.pe.kr


4. servermaster.pe.kr 로 변경을 하였습니다.
다음 명령을 수행한 후 다시 로그인을 하면 변경된 것을 확인 할 수 있습니다.
windpyj@ubuntu:~$ sudo /bin/hostname -F /etc/hostname


5. 다시 로그인 하면 프롬프트에 다음과 같이 나옵니다.
windpyj@servermaster:~$

windpyj@servermaster:~$ hostname
servermaster.pe.kr
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

* BootStrap -> Extensions -> System ClassLoader -> Application 별 ClassLoader 순으로 Chain 생성 됨

* Application 을 Deploy 할 때 마다, 별도의 Class Loader 를 생성하며, Parent 를 System ClassLoader 로 지정한다.

* WebLogic 의 Application ClassLoader 는 3가지 종류 임 (EJB-JAR, WAR, EAR)

- EJB-JAR : 각 EJB Jar 파일 당 1개의 ClassLoader 생성함. 그래서 다른 JAR 파일의 클래스 Instance 는 참조 불가 함.

- WAR : 일반적으로, 보통의 ClassLoader 와 같이 우선순위를 갖으나, WEB-INF/classes 와 WEB-INF/lib 디렉토리의 클래스에 한하여, Parent ClassLoader 보다 WAR ClassLoader 가 우선순위를 갖도록 지정할 수 있다. PreferWebInfClasses 옵션을 true 로 설정하면 가능하다.

- EAR : EAR 로 배포 구조를 갖게되면, WAR ClassLoader 와 EJB-JAR ClassLoader 가 Delegation 관계를 갖으며 생성된다. 즉, EJB-JAR ClassLoader 를 통해 WAR ClassLoader 가 생성되어, WAR ClassLoader 가 EJB ClassLoader 의 Child 가 되므로, WAR 가 EJB 를 사용할 수 있게 되는것이다.
* ClassLoading 순서 : cache 점검 -> 없으면 부모에게 로드 위임 -> 부모 로드 못하면 자신이 로드
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

Java 2 에서 부터 (1.3)는, Delegation Model 을 사용한다.

1. Class 가 이미 로드되어있는지 체크
2. Parent 의 Class Loader 에게 Class Load 하도록 위임함
3. 2 과정을 반복하며 최상위 Class Loader 까지 간다
4. 더이상 부모 ClassLoader 가 없으면, BootStrapClassLoader() 에게 요청한다
5. BootStrap 부터 다시 차근히 내려오면서 Class 로딩을 한다.
6. 클래스가 로드 되면 해당 클래스를 리턴한다
7. 이상이 ClassLoader.loadClass() 메커니즘이고, 만약 parent 에서 못찾으면,
    자신의 findClass() method 를 call 해서 클래스를 찾는다

Custom ClassLoader 를 생성할 때, 생성자에 parent classloader 를 지정할 수 있게 되어있음
만약 지정하지 않으면, 기본적으로 getSystemClassLoader() 를 통해, SystemClassLoader 를
parent 로 지정함. 이 system class loader 는 현재 invoking thread 의 context class loader 로 설정된다

* BootStrap 클래스로더 : Java Runtime Library 에 있는 클래스를 로딩하는 역할을 맡고 있음. 클래스로더 체인의
가장 첫번째임. 기본적으로 rt.jar 에 있는 클래스를 Bootstrap ClassLoader 가 로드 한다.

* 하나의 JVM 에 여러 클래스로더가 각각 같은 Package.Class 를 Load 하면, 각각의 인스턴스가 따로 생긴다.
결국, Java 에서의 클래스 생성은 "패키지, 클래스, 클래스로더" 의 3가지의 조합으로 구분되는 것이다

* Java2 의 표준 Runtime Library (jre/lib/rt.jar) 는 공개/내부사용 클래스 로더들이 있다
  - java.net.URLClassLoader
   파일, HTTP, FTP 등을 사용하여 Class 를 Load 할 수 있는 ClassLoader 임

  import java.net.URL;
  import java.net.URLClassLoader;
  
  public class FileSystemTest {
  
   public static void main(String[] args) throws Exception {
   URL[] urls = { new java.io.File("/usr/classes").toURL(); }
  
   URLClassLoader ucl = new URLClassLoader(urls);
   
   Class kalss = ucl.loadClass("javacan.exam.HelloWorld");
   Object obj = klass.newInstance();
   // obj를 사용하여 적절한 것을 한다.
   }
  }

  - BootStrap 클래스로더
   엄밀히 말해 Java 클래스로더가 아니고, 네이티브 로더로, Object 와 같은 코어 자바클래스를 VM 에 로딩할때 사용된다. sun.boot.class.path 프로퍼티에 정의 된 값을 사용하여 자바 런타임 라이브러리를 찾는다. 만약 명시적으로 지정하지 않으면 <JDK>/jre/lib/rt.jar 로 부터 런타임 클래스들을 로딩한다.
  JDK 1.0 이나 1.1.X 대는 CLASSPATH 나 -classpath 에 런타임을 추가해줬어야 하지만, Java2 부터는 BootStrap 클래스로더가 런타임라이브러리를 자동으로 로드해주므로 지정 할 필요가 없다.

  - sun.misc.Launcher$ExtClassLoader
   자바의 확장클래스를 로드할 때 사용한다. ExtClassLoader 는 URLClassLoader 를 상속하며, java.ext.dirs 프로퍼티에 지정한 디렉토리에 위치한 .jar 들로 부터 클래스를 읽어온다. 명시하지 않으면 기본적으로 <JDK>/jre/lib/ext 디렉토리에 있는 .jar 들을 읽어서 클래스를 로드한다

  - sun.misc.Launcher$AppClassLoader
   시스템 또는 어플리케이션 클래스로더라고 불린다. java.class.path 프로퍼티에 명시된 경로에서 코드를 로딩하는 클래스로더이다. URLClassLoader 를 상속한다. CLASSPATH 에 있는 디렉토리나 .jar 파일들은 모두 URL 로 변환되어 AppClassLoader 에게 전달된다.

   ClassLoader.getSystemClassLoader() 를 호출하면 이 클래스가 리턴된다. 개발자가 작성한 대부분의 클래스는 이 클래스로더를 통해 로드된다. AppClassLoader 는 부모 ClassLoader 로 ExtClassLoader 를 지정하고 있으므로, ext 디렉토리에 있는 jar 파일로 부터 클래스들을 로드할 수 있다.

  - sun.applet.AppletClassLoader
  
브라우저가 Applet 의 바이트코드를 다운로드 하고, 그 애플릿을 실행하기 위한 클래스를 로드하는 Class Loader 이다. URLClassLoader 를 상속받고 있어서, HTTP 나 FTP 등을 통해 클래스를 로드 가능 한 것이다. 그러나 IE 나 각 브라우저 별로, 애플릿 클래스로더를 구현하고 있는 경우가 있어, 브라우져 별로 동작이 다를 수 있다.

  - java.security.SecureClassLoader
   JVM 에 바이트코드를 로딩하고 사용하는데에 관한 보안을 제어하는 추상클래스로, URLClassLoader 를 포함한 ClassLoader 가 상속받아서 사용하는 추상클래스이다.

  - java.rmi.server.RMIClassLoader
   ClassLoader 가 아니며, RMI 런타임에서 클래스의 로딩과 마샬링을 처리해주는 래퍼클래스이다. 실제로sun.rmi.serer.LoaderHandler 와의 간단한 브릿지 역할을 하는 클래스이다. 실제 클래스 로딩은 LoaderHandler 의 Inner 클래스가 담당하게 된다. 이때 이 inner 클래스들은 URLClassLoader 를 상속받아 구현되어 있다.

* Custom ClassLoader 는 findClass(String) 를 구현하여 자신만의 클래스 로딩에만 신경쓰면 되며, 나머지는 parent 로 올리면 된다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

보통은 저런 경우는 안생기지만, 하나의 WAS 에서, Context 가 다른 두개의 웹어플리케이션에서 각각 JNI 호출을 통해, 같은 DLL 을 사용하려는 경우 발생한 적이 있다.

이때는, 해당 JNI Java 라이브러리(.jar)나 클래스를 WAR Class Loader 가 아닌, System Class Loader 가 로드할 수 있게, System Class Path 에 두어 사용해야 한다.

웹로직의 경우, 해당 jar 를 Domain 밑의 lib 이나 server 의 lib 에 두고서 사용하면 된다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,


1. java 로 DLL 의 프로토타입 생성

package jnitest.loader;

public class JNILoader {
 public native void greet();
 
 /*
 static {
  System.loadLibrary("HardInfo");
 }
 */
 
 public void loadLibrary() {
  System.loadLibrary("HardInfo");
 }
}

2. javah -jni <위 1번의 class 이름> 해서, C 언어용 헤더파일 생성

3. 위 헤더파일을 CPP 에서 include 하고, JDK 의 include 디렉토리를 Include Path 로 잡아서
cpp 컴파일 진행

4, 만들어진 DLL 이나 so 를 적정 디렉토리에 위치함

5. -Djava.library.path=<dll 패스> 하여 추가하더나, PATH 에 해당 디렉토리 잡히거나, Windows 디렉토리에 넣는다

6. 위 1 예제의 객체를 생성하고, 위의 경우, loadLibrary() 호출하고 (아니면 아예 static{ } 블록에서 System.loadLibrary 사용) JNI 를 사용한다

반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,