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

[maven] source jar, javadoc 다운로드

java 2016. 7. 13. 11:49 by manywaypark

maven을 쓰면 기본적으로는 pom.xml 파일의 dependency에 지정된 artifact들의 binary jar만 받아오는데, 소스나 javadoc이 보고싶은 경우가 있다.

아래처럼 해주면 source jar, javadoc을 받아온다.


mvn dependency:sources

mvn dependency:resolve -Dclassifier=javadoc


ref: http://stackoverflow.com/questions/2059431/get-source-jars-from-maven-repository


happy hackin'

문제:

eclipse에서 m2eclipse를 쓸때,

project를 import(일반적으로 쓰는 Import > General > Existing Projects into Workspace)한 후에 right click project > Configure > Convert to Maven Project를 선택하면 다음과 같은 오류가 나면서 제대로 동작하지 않는 경우가 있다.

An internal error occurred during: "Enabling Maven Dependency Management".

Unsupported IClasspathEntry kind=4

해결:

  1. rightclick project, remove maven nature
  2. mvn eclipse:clean (with project open in eclipse/STS)
  3. delete the project in eclipse (but do not delete the sources)
  4. Import existing Maven project

ref: http://stackoverflow.com/questions/15065093/an-internal-error-occurred-during-updating-maven-project-unsupported-iclassp


happy hackin'

[WARN] maven encoding

tips & tricks 2011. 9. 26. 13:42 by manywaypark
문제
maven을 사용해서 빌드할 때 다음과 같은 무시무시한(?) 경고가 나온다면, 인코딩 설정이 제대로 안된 것이다.
내 경우는 맥을 사용했으므로 MacRoman으로 fallback 되었다는 이야기다.

$ mvn package or something
...
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
...
[WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
...

해결
기본적으로 platform에 종속적이게되므로, 소스/리소스의 인코딩을 하나로 통일하고 다음과 같이 사용한 인코딩을 pom.xml에 적시하면 문제가 해결된다.
<project>
.....
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
......
</project>

refs:
http://maven.apache.org/general.html
http://maven.apache.org/plugins/maven-resources-plugin/examples/encoding.html

happy hackin'

maven에 3rd party jar 추가하기

tips & tricks 2011. 8. 12. 17:21 by manywaypark
local repository(~/.m2/repository)에 jar를 추가한다.
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
    -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>


ref: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

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'

현재(2009-04-23) eclipse maven plugin을 update site에서 설치하려고 하면 다음과 같은 에러가 나면서 설치가 안된다.
ERROR Message:
Cannot find a solution satisfying the following requirements org.eclipse.swt [3.4.1.v3449c].

해결:
Install Package 리스트에서 AJDT를 빼고하면 해결된다.
(이건 머하는 놈일까? 요즘 eclipse가 많이 복잡해진듯하다.)

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!!

maven 사용하기 - ejb3

java 2007. 1. 30. 16:55 by manywaypark
기본적으로 EJB3에서는 annotation을 사용할 경우 ejb-jar.xml 파일이 필요없는데, 현재 배포되는 maven-2.0.4에 포함된 maven-ejb-plugin은 ejb-jar.xml 파일이 없을 경우 에러를 내고 빌드되지 않는다. maven의 source repository에서 plugin들의 소스를 받아서 'mvn install'을 해주면 패치가 적용되어 ejb-jar.xml 파일이 없어도 ejb 프로젝트를 빌드할 수 있다.

happy hackin'

maven 사용하기 - 테스트

java 2007. 1. 23. 03:37 by manywaypark
  1. 테스트하지 않고 goal 실행하기:
    $ mvn -Dmaven.test.skip=true -e package
    모든 테스트를 통과해야만 packaging할 수 있는 건 너무 매정하다. 그래서, 테스트하지 않고도 packaging하게 만드는 것이다. 테스트 통과하지 못하는 놈을 release하는 짓은 절대 하면 안된다. 그러나, 가끔 특수한 상황에서 사용하면 유용하다.

  2. 테스트 실패해도 goal 실행하기:
    $ mvn -Dmaven.test.failure.ignore=true -e package
    역시나 테스트 한두개 실패했다고 packaging할 수 없다는 것은 너무 매정하지 않은가?

  3. 특정 테스트만 하고 goal 실행하기:
    $ mvn -e test -Dtest=*FooBarTest
    테스트 클래스의 패턴을 지정할 수 있다. maven expression으로 하면 ${test}이고, 일반적 표현으로 하자면, **/${test}.java이다. 이 옵션이 사용되면 includesexcludes에서 지정된 패턴들은 무시된다.

위에서 보듯 mvn에 전달하는 인자는 순서에 상관이 없다.

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

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

03-29 19:33