manywaypark's Blog
개발, 검색, 함수

그냥 링크만...

ref:

http://www.mkyong.com/java/how-to-convert-java-project-to-web-project-in-eclipse/


happy hackin'

framewerk(오타 아님)는 일종의 autotools wrapper이다.

c/c++은 물론이고 javascript와 erlang도 지원하는 점이 맘에든다.

사용법은 참조링크에 쉽고 자세하게 나온다.

간단한 예제를 하나 들자면 erlang project에서 rebar 및 git을 사용할 경우 다음과 같이 한다.

$ fw-init --name myprj --template erlang-rebar --revision git

$ cd myprj

$ ./bootstrap

$ ./configure

$ make

지원되는 버전 관리 도구(revision에서 설정): git, svn, cvs

지원되는 개발 환경(template에서 설정): c, c++, erlang, erlang-rebar, java-mvn


refs: https://code.google.com/p/fwtemplates/


2014-11-11 추가: project configuration(version number 설정 등)은 fw-pkgin/config 파일을 편집한다.


2016-06-07 추가: 원래 프로젝트 페이지는 관리 안된지 좀 오래 인듯. 비교적 최근까지 관리되는 곳은 여기: https://github.com/dukesoferl/fw

또한 빌드 및 사용 법은, ./bootstrap -> ./build (--prefix=/usr/local) -> sudo make install 로 하면 좀더 간편하다.


happy hackin'

[TIP] Java on Mac OS X 그리고 Maven

java 2009. 4. 30. 00:43 by manywaypark
hudson을 build하다가 생긴 문제의 해결방법이다(좀 특이하다는 말). 이전 포스트와도 좀 연관이 있다.
내 경우(유니바디 알미늄 맥북, java가 깔려서 출고된다)에는 터미널에서 java -version을 하면 1.5대의 버전이 찍혔다. 기본 설정인 듯했다.
결론부터 말하자면 Mac OS X에서는 "Applications/Utilities/Java/Java Preferences"에서 java 환경을 설정할 수 있다.
1.6(메뉴상에는 Java SE 6으로 표시된다)으로 설정하고 명령행에서 확인하면 다음과같이 나온다.
$ java -version
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06-153)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)

그럼에도 불구하고, hudson을 build하기위해 터미널에서 mvn install을 실행하면 이전 포스트의 에러가 반복되었다.
Detected JDK Version: 1.5.0-16 is not in the allowed range [1.6.0,].
해결책은 JAVA_HOME을 설정하면 된다.
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
아득한 기억을 더듬어보면, windows와 linux에서는 JAVA_HOME이 설정 안되어있으면 에러가 나면서 build 자체를 시도하지도 않았던거같은데...  맥에서는 왜 이런거지? Orz.

참고:

happy hackin'
eclipse의 maven plugin인 m2eclipse를 이용해서 빌드를 할때 다음과 같은 메시지가 나오면서 빌드가 멈출 때가 있다.
Detected JDK Version: 1.5.0-16 is not in the allowed range [1.6.0,].
기본적으로 컴파일에 필요한 자바 버전이 안맞아서 나오는 메시지인데, 실제로 명령행에서 빌드할 때는 JAVA_HOME이 정확한 버전(이 경우 1.6이상 버전의 JDK)을 가리키고 있다면 mvn으로 잘 빌드되는 환경에서도 eclipse 내에서 m2eclipse를 사용하면 이 에러가 나는 좀 복잡한 상황이다.
일단 pom.xml에서 오른쪽 클릭으로 문맥 메뉴 선택후 "Run As > Maven Build..."를 해서 빌드를 하면 된다는 workaround는 찾았는데 조금 찜찜하다.

참고:

참고2:
eclipse는 JAVA_HOME 환경변수와는 무관하게 독자노선(?)을 걷는다. eclipse.ini에서 설정가능하다. README 참조.
또한 eclipse를 실행시키는 java(eclipse.ini에서 설정)와 eclipse가 build에 쓰는 java(Preferences에서 설정)는 다를 수 있다.

happy hackin'

Project Properties -> Project Facets panel에서 설정


happy hackin'
jetty에 동일한 war를 context path를 달리해서 여러 instance를 띄우는 방법에 관해 간략히 설명한다.
비교적 복잡한 solr를 예로 들겠다.

jetty 설치
jetty는 debian package를 다운로드 받아서 깔면 별 문제없이 잘 실행된다.
(ftp://ftp.mortbay.org/pub/)
현재 안정 버전중 최신인 jetty-6.1.11를 받았다.

동일 war 여러 instance 설정
동일한 war를 다른 context path 및 설정으로 실행시키고 싶었다.
solr로 예를 들자면, 몇개의 설정이 다른 solr가 떠서 url에 따라 다른 분야의 검색에 관한 서비스(인덱싱, 검색 질의 등)를 제공하는 것이다.
solr wiki에 관련 설명이 나오는데 좀 모호한 부분이 있어서 한번 정리해 보았다.
  1. 중복 deploy 방지 (disable WebAppDeployer): /etc/jetty6/contexts 쪽의 설정만 사용하게 하기위해서 /etc/jetty6/jetty.xml에서 다음 부분을 삭제하거나, 주석처리한다.
        <Call name="addLifeCycle">
          <Arg>
            <New class="org.mortbay.jetty.deployer.WebAppDeployer">
              <Set name="contexts"><Ref id="Contexts"/></Set>
              <Set name="webAppDir"><SystemProperty name="jetty.home" default="."/>/webapps</Set>
          <Set name="parentLoaderPriority">false</Set>
          <Set name="extract">true</Set>
          <Set name="allowDuplicates">false</Set>
              <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
            </New>
          </Arg>
        </Call>
    jetty.home/webapps에 있는 war를 자동으로 deploy하게 하는 부분인데, contexts에 있는 설정에서 webapps를 참조하게 할 것이므로 비활성화 시키는 것이다 (다른 디렉토리를 사용하면 이 과정이 아마 필요없을듯하다).

  2. 설정 파일 생성 (동일한 war를 사용하는 다른 instance도 contextPath를 달리해서 생성가능하다.)
    /etc/jetty6/contexts/people.xml :
    <?xml version="1.0"  encoding="ISO-8859-1"?>
    <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
    <Configure class="org.mortbay.jetty.webapp.WebAppContext">
      <!-- Required -->
      <Set name="contextPath">/people</Set>
      <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/apache-solr-1.3-dev.war</Set>

      <Set name="defaultsDescriptor"><SystemProperty name="jetty.home" default="."/>/etc/webdefault.xml</Set>
      <Set name="overrideDescriptor"><SystemProperty name="jetty.home" default="."/>/contexts/override.d/override-people.xml</Set>

      <!-- Active JNDI so we can specify "solr/home" -->
      <Array id="plusConfig" type="java.lang.String">
          <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
          <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
          <Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
          <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
          <!-- <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item> -->
      </Array>
      <Set name="ConfigurationClasses"><Ref id="plusConfig"/></Set>

      <!-- Adding <New class="org.mortbay.jetty.plus.naming.EnvEntry"> -->
      <!-- here sets a GLOBAL jndi value. Arg!                         -->
      <!-- So we specify "solr/home" in the overrideDescriptor instead -->
    </Configure>

    /etc/jetty6/contexts/override.d/override-people.xml :
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app
       xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       version="2.5">

    <!-- This web.xml format file is applied to the people webapp
         AFTER it has been configured by the default descriptor
         and the WEB-INF/web.xml descriptor -->

      <env-entry>
        <env-entry-name>solr/home</env-entry-name>
        <env-entry-value>./people</env-entry-value>
        <env-entry-type>java.lang.String</env-entry-type>
      </env-entry>

      <!-- NOTE: If Solr looked at something like this:                -->
      <!-- NOTE:   getServletContext().getInitParameter("solr.home");  -->
      <!-- NOTE: we could do the following w/o mucking with JNDI       -->
      <!--
      <context-param>
        <param-name>solr.home</param-name>
        <param-value>fixme-some-path</param-value>
      </context-param>
      -->
     
    </web-app>

  3. 위의 두 파일은 인물 검색용 이라고 가정하자. 위의 파일에서 파일명과 파일 내용에 나오는 people을 book으로 바꾸어서 저장하면, 이제 http://localhost:8080/pepple/admin, http://localhost:8080/book/admin 두개의 독립된 solr를 하나의 servlet engine - jetty -에서 실행시키고 있는 것이다.

  4. 두 context path에서 실행은 되는데 아마도 에러가 날것이다.
    solr 관련 설정이 없어서 인데, "solr/home"으로 지정한 디렉토리에, solr의 example에 있는 solr 디렉토리 내의 파일들을 다 복사해주면 된다.
    즉 위의 설명대로 파일 및 디렉토리를 구성했다면,
    # JETTY_HOME은 보통 /usr/share/jetty6 이다.
    $ cp -R /path/to/solr/example/solr/* $JETTY_HOME/people/
    $ cp -R /path/to/solr/example/solr/* $JETTY_HOME/book/

  5. 그래도 에러날 것이다.
    이제 정말 마지막 설정하나,
    $JETTY_HOME/(people|book)/conf/solrconfig.xml 에서
    <dataDir>${solr.data.dir:./solr/data}</dataDir>로 되어 있는 부분을
    <dataDir>${solr.data.dir:./people/data}</dataDir>
    <dataDir>${solr.data.dir:./book/data}</dataDir>
    으로 각각 고친다.

  6. 이젠 에러 안날 것이다.
happy hackin'

ps. 요즘 들어 jetty를 많이 사용한다. 가볍고 편리하다. 특히나 jetty-maven-plugin은 말 그대로 zero-configuration!!
플러그인 설치가 꼬여서 eclipse를 지웠다가 재설치를 했는데,
다음과 같은 에러 로그를 뿌리면서 Ubuntu box에서 eclipse가 실행되지 않았다.

로그 처음 부분:
!SESSION 2008-06-11 19:16:32.612 -----------------------------------------------
eclipse.buildId=M20070212-1330
java.version=1.6.0_03
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64 -debug -consoleLog

!ENTRY org.eclipse.osgi 2 1 2008-06-11 19:16:35.246
!MESSAGE NLS missing message: initializer_error in: org.eclipse.core.internal.runtime.messages

!ENTRY org.eclipse.osgi 2 1 2008-06-11 19:16:35.247
!MESSAGE NLS missing message: fileInitializer_fileNotFound in: org.eclipse.core.internal.runtime.messages

!ENTRY org.eclipse.osgi 2 1 2008-06-11 19:16:35.248
!MESSAGE NLS missing message: fileInitializer_IOError in: org.eclipse.core.internal.runtime.messages

!ENTRY org.eclipse.osgi 2 1 2008-06-11 19:16:35.248
!MESSAGE NLS missing message: fileInitializer_missingFileName in: org.eclipse.core.internal.runtime.messages

!ENTRY org.eclipse.osgi 4 0 2008-06-11 19:16:35.270
!MESSAGE An error occurred while automatically activating bundle org.eclipse.ui.workbench (8).
!STACK 0
org.osgi.framework.BundleException: The activator org.eclipse.ui.internal.WorkbenchPlugin for bundle org.eclipse.ui.workbench is invalid
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:141)


해결법은 간단히 다음 명령어 입력:
$sudo apt-get --purge remove libswt3.2-gtk-*
#lets him remove all eclipse pakages and reinstall eclipse
$sudo apt-get install eclipse
libswt와 모종의 충돌(?)이 있는 듯하다.

참고:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=446299#120
https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/109583

happy hackin'
Window > Preferences... 의 왼쪽 패널에서 Java > Editor > Templates를 선택하면 다양한 template을 자바 에디터에서 사용할 수 있다.
예를 들어 내가 자주 사용하는 logger 관련 선언 자동 삽입은 다음 순서로 하면 쓸 수 있다.
  1. "New..."를 선택한다.
  2. Name에 "_l"을, Description에 "insert logger", Pattern에 "protected final static Log log = LogFactory.getLog(${enclosing_type}.class);"을 넣고 "OK"를 누른다.
    사용자 삽입 이미지
  3. java 편집기에서 _l을 타이핑한 후에 Content Assist 명령을 입력하면, 현재 클래스의 logger를 자동으로 삽입할 수 있다.
    Content Assist 명령은 emacs 모드의 경우 Alt + /이고 default 모드의 경우 Ctrl + Space이다.
참고: "Insert Variable..." 버튼을 눌러보면 다양한 context 관련 변수(현재 클래스명 및 메서드 관련 등) 및 유용한 변수들(날짜, 시간관련 등)을 Pattern에 넣을 수 있다.

happy hackin' with DRY

Linux에서 java 한글 글꼴 설정

java 2007. 10. 1. 16:30 by manywaypark
먼저 Windows의 윤곽선 글꼴을 쓰기 위해,
Windows의 %windir%\Fonts 디렉토리의 batang.ttc, gulim.ttc를 리눅스의 ~/.fonts 디렉토리로 복사한다.
http://bebop.emstone.com/research/linux/ubuntu_java15_hangul/view에서 다운로드 받은 fontconfig.properties 파일을 /usr/lib/jvm/java-1.5.0-sun/jre/lib에 복사한다.
fontconfig.properties 내의 /home/lethean/을  $HOME으로 변경한다.

java application에서 멋지게 나오는 한글을 감상한다.

happy hackin'




continuum 설치하기

java 2007. 1. 18. 16:33 by manywaypark
continuum continuous integration을 위한 apache 프로젝트이다.
SCM(svn 등), maven과 연동하여 강력한 빌드 시스템을 구축할 수 있다.
기본적으로 적당한 곳(/usr/local/)에 압축을 풀고 JAVA_HOME을 설정한 후 하위의 bin 디렉토리에서 OS 종류에 맞는 디렉토리를 찾아 startup script를 실행시키면 문제 없이 동작한다(고 설명되어있다).

그러나, 실제로는 64bit linux에서는 동작하지 않았다.

continuum에 같이 패키징된 java service wrapper가 32bit용으로 컴파일 된 것이어서 서비스 자체가 뜨지 않았다. 그냥 간단히 java service wrapper 64bit용 바이너리를 받아서 bin/linux 디렉토리에 넣어 보았으나, 역시 제대로 실행되지 않았다. 조금 낙담했으나, 소스를 받아서 컴파일 후에 wrapper, libwrapper.sobin/linux에 넣고 ./run.sh start하니 필요한 db를 만들고 어쩌고 하면서 제대로 서비스가 올라갔다.

happy hackin'
1 
분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

04-26 17:29