Nexus 에 배포(deploy)할 때, 400 에러가 날 경우 (보통 릴리즈 버젼) 에는 넥서스의 리파지토리의 중복 등록 허용이 불가로 설정되어있을 경우 그러하다.

err.log
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy (default-deploy) on project ecm-parent: Failed to deploy artifacts: Could not transfer artifact com.comas.solme.ecm:ecm-parent:pom:5.0.0 from/to releases (http://nexus.yourcompany.co.kr:8081/nexus/content/repositories/releases): Failed to transfer file: http://nexus.yourcompany.co.kr:8081/nexus/content/repositories/releases/com/comas/solme/ecm/ecm-parent/5.0.0/ecm-parent-5.0.0.pom. Return code is: 400 -> [Help 1]

다음과 같이 'Allow Redeploy'로 바꿔주자.



  1. BlogIcon 서류 2013.12.17 16:03

    구글링하다 따뜻한 한글 문서가~ 권한문제인 줄로만 알고 삽질하다ㅋ 감사합니다.

    • BlogIcon slothink 편현장 2014.01.02 11:06 신고

      도움이 되셨다니, 참 다행이네요. 댓글까지 달아주니, 포스팅 하는 것에 대한 보람을 느낍니다. 감사해요 ㅠ_ㅠ

지금까지 jboss 등등 유명한 오픈소스들의 리파지토리를 넥서스에 직접 등록해서 사용하고 있었는데, 그럴 필요가 없었다. 이미 Sonatype 에서 다 모아서 서비스를 해주고 있었던 것-_-;


Sonatype 에서 제공하는 오픈소스용 Nexus 는 https://oss.sonatype.org/index.html 여기로 접속 가능하다.

그리고 릴리즈용과 스냅샷용 리파지터리는 다음과 같다.

  • https://oss.sonatype.org/content/repositories/releases/
  • https://oss.sonatype.org/content/repositories/snapshots/
스트라이프 소스 받아다가 할려고보니깐, parent 로 소나타입이 지정되있는걸 보고 깨달았다. 아.. 설마

<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>5</version>
</parent>

여튼, 소나타입 덕분에 살맛 난다.. 감사감사..
그나저나 Java 8 이 나오면 maven 망하나? 

Archetype 만드는 방법은 매우 쉽다.

간단히 말하면, 

  1. 우선 Archetype 으로 사용된 maven 프로젝트를 먼저 만들고,
  2. archetype 플러그인으로 실제 archetype 용 프로젝트를 자동 생성한다.
  3. 생성된 archetype 프로젝트에 필요한 설정을 더 추가하여 배포한다.

 

1. Archetype 을 위한 샘플 프로젝트 생성

우선 pom.xml 이 있는 maven 프로젝트를 먼저 만든다.
이 프로젝트가 archetype 에 들어갈 기본 골격이다. 물론, archetype 프로젝트 생성 후에도 수정이 가능하다.
만일, 샘플로 사용할 프로젝트가 있다면 별도 프로젝트 생성 없이 해당 프로젝트를 사용해도 된다.

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kr.pe.slothink</groupId>
  <artifactId>slothink-webapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  ...
</project>

archetype 프로젝트시 생성될 프로젝트에 소스를 포함고 싶다면, 소스를 추가하되 공통적인 패키지명만 유지한다. 패키지명은 어떤 패키지명을 사용해도 상관없다.

archetype 프로젝트 생성시에는 소스의 패키지의 공통적인 부분을 archetype 을 이용해 프로젝트 생성시 입려되는 패키지명의 값으로 치환을 시켜준다.

2.Archetype 용 프로젝트 생성

해당 프로젝트에서 다음의 maven 플러그인 골을 수행한다.

>mvn archetype:create-from-project

해당 골이 성공적으로 수행되면 target/generated-sources/archetype 에 archetype 용 프로젝트가 생성된다.

생성된 프로젝트의 pom.xml 을 보면 다음과 비슷할것이다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kr.pe.slothink</groupId>
  <artifactId>slothink-webapp-archetype</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>maven-archetype</packaging>
  <name>slothink-webapp-archetype</name>
  ....
</project>

 

주목할 만한것은 패키징 타입이 'maven-archetype' 이라는 것과 생성된 프로젝트 이름에 '-archetype' 이 붙었다는 것이다.

  

3.Archetype 프로젝트 배포하기

이제 archetype 프로젝트를 다룰 준비가 완료되었다.(이전 샘플 프로젝트는 이제 버린다.)
이전 샘플 프로젝트에서 미처 추가하지 못한 소스라던지, 설정들은 생성된 프로젝트에서 추가 및 수정한다.
아마 생성된 리소스들을 확인하면 무슨 뜻인지 이해가 잘 갈 것이다.
그래도 이해가 안된다면 메이븐 공식 사이트를 참조한다. http://maven.apache.org/guides/mini/guide-creating-archetypes.html 

 

배포 방법은 일반 메이븐 프로젝트 배포방법과 동일하다.

install 을 사용해서 local 에 저장할 수 있으며

> mvn install

 deploy 를 이용해서 사내 저장소에 저장도 가능하다.

> mvn deploy

하지만 deploy 를 할경우에는 생성된 archetype 프로젝트 pom 에 배치 정보를 추가 해야할것이다.
(샘플 프로젝트에 있던 배치 정보는 의미 없다. 새로 생성된 pom 에 다시 작성해야한다.)

 

4.생성한 archetype 으로 프로젝트 만들기

install 과정을 거쳤다면 local 카탈로그에서 해당 achetype 을 조회할 수 있다.

임의의 위치에서 다음과 같이 실행하여보자.

mvn archetype:generate -DarchetypeCatalog=local

 이제 아름다운 광경을 목격하게 될 것이다. ^^


이런 경우가 있습니다. 이클립스에서 컴파일을 하면 문제가 되는 패키지 없이 컴파일이 잘되는데, 유독 maven 에서 클린을 해서 날려버린다음 빌드를 하려하면 특정 패키지를 못 찾는 경우가 있습니다.
도대체 감을 못잡으시겠죠?

원인은 간단합니다. 오타와 이클립스 빌드 구조의 한계죠.
예를 들어 pom.xml 에서 depdency 하는 것이 다음과 같다면 발생합니다.

<dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <version>1.0.2</version>
            <scope>provide</scope>
</dependency>

provide 가 아니라 provided 죠?

<dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-activation_1.1_spec</artifactId>
            <version>1.0.2</version>
            <scope>provided</scope>
 </dependency>


가 맞습니다. 그럼 이클립스에서는 왜 잘 되나구요?
이클립스는 provide 나 compile 이나, test 나 똑같이 빌드패스에 등록을 하여 사용합니다. 즉, 구분을 하지 않습니다. 따라서 이클립스 프로젝트의 빌드에서는 scope 를 처리 안한다는거죠. 그래서 빌드가 됩니다

반면! 메이븐이 컴파일 할 경우에는 scope 를 따지니깐, 오타가 있으면 무시해버리죠. 즉, 저 패키지를 가져오지 않아 빌드가 실패가 됩니다.

이넘 때문에 오랜 시간 고생하고 있었네요. 매번 이클립스 빌드 후 인스톨...ㅡㅡ;;
Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:pom:1.0' in repository daeati


이런 오류가 발생했다. 만약 maven 실행시 이런 오류가 발생했다면 지금 당신은 어처구니 없는 짓을 한거다.

PS D:\workspace\lotte_xcms\lottexcms> mvn hibernate3:hbm2doc
[INFO] Scanning for projects...
Downloading: http://211.52.77.7:8081/nexus/content/groups/public/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.pom
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:pom:1.0' in repository daeati (http://211.52.77.7:8081/nexus/content/groups/public)
Downloading: http://repo1.maven.org/maven2/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.pom
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:pom:1.0' in repository central (http://repo1.maven.org/maven2)
Downloading: http://211.52.77.7:8081/nexus/content/groups/public/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.jar
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:jar:1.0' in repository daeati (http://211.52.77.7:8081/nexus/content/groups/public)
Downloading: http://repo1.maven.org/maven2/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.jar
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:jar:1.0' in repository central (http://repo1.maven.org/maven2)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:pom:1.0' in repository daeati (http://211.52.77.7:8081/nexus/content/groups/public)
Downloading: http://repo1.maven.org/maven2/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.pom
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:pom:1.0' in repository central (http://repo1.maven.org/maven2)
Downloading: http://211.52.77.7:8081/nexus/content/groups/public/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.jar
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:jar:1.0' in repository daeati (http://211.52.77.7:8081/nexus/content/groups/public)
Downloading: http://repo1.maven.org/maven2/jdbc/artifact/groupid/jdbc-driver/1.0/jdbc-driver-1.0.jar
[INFO] Unable to find resource 'jdbc.artifact.groupid:jdbc-driver:jar:1.0' in repository central (http://repo1.maven.org/maven2)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) jdbc.artifact.groupid:jdbc-driver:jar:1.0

  Try downloading the file manually from the project website.

  Then, install it using the command:
      mvn install:install-file -DgroupId=jdbc.artifact.groupid -DartifactId=jdbc-driver -Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there:
      mvn deploy:deploy-file -DgroupId=jdbc.artifact.groupid -DartifactId=jdbc-driver -Dversion=1.0 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency:
        1) com.daeati:lottexcms:war:0.0.1-SNAPSHOT
        2) jdbc.artifact.groupid:jdbc-driver:jar:1.0

----------
1 required artifact is missing.

for artifact:
  com.daeati:lottexcms:war:0.0.1-SNAPSHOT

from the specified remote repositories:
  central (http://repo1.maven.org/maven2),
  daeati (http://211.52.77.7:8081/nexus/content/groups/public)



내가 했던 어처구니 없는 일을 풀어보노라면,,,,

좀전에 하이버네이트 플러그인을 사용하려고 다음의 의존성을 추가했다.

<dependency>
    <groupId>jdbc.artifact.groupid</groupId>
    <artifactId>jdbc-driver</artifactId>
    <version>1.0</version>
</dependency>


그리고 나서 이 오류가 발생했다. 즉, jdbc.artifact.groupid:jdbc-driver:jar:1.0 을 maven 저장소로부터 찾을 수 없다는 것이다.

그래서 코드하우스도 점검해보고, 메이븐 저장소를 샅샅이 찾았지만. 찾을 수 없다.

............



그렇다. 자신에게 맞는 jdbc 를 넣으세요(알아서 하세요요요요)

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.3.0</version>
</dependency>


를 추가했다. Success. 좀 부끄러워질 필요가 있다ㅡㅡ*
maven repository 에서 소스를 내려받는 명령어입니다.
오픈소스도 마구마구 내려받아서 디버깅 할 수 있다는거 참 감격이죠~

mvn dependency:sources
war 프로젝트의 경우에는 war 배포시 WEB-INF/lib 안에 dependency 하고 있는 jar 들이 배포된다.
그러나 jar 프로젝트의 경우에는 컴파일을 하기 위해서 dependency 하고 있는 라이브러리들을 사용할 뿐이지 배포물에는 포함되지 않는다.


1. maven 프로젝트에서 단일 jar 만들기

배포물(jar) 에 해당 라이브러리도 같이 넣고 싶다면 assembly 골을 사용하면 된다.
$emds-core> mvn assembly:assembly

단, 이것을 실행하기 위해선 pom.xml 의 build/plugins 하위에 다음과 같은 설정을 추가해야한다.
만약, 단일 jar 파일을 실행 jar 로 만들 경우엔 manifest 설정도 추가한다
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
이 골은 의존하고 있는 프로젝트의 파일들을 전부 풀어서 하나의 jar 로 만들어버린다. 따라서 많은 수의 라이브러리를 하나의 jar 로 만들고 싶은 경우 사용할 수 있다.

2. maven 프로젝트에서 의존하고 있는 jar 추출하기

그러나 현재 프로젝트에서 사용하고 있는 dependency 라이브러리들에 대해서 다 추출하고 싶다면(실제로 파일로 가져오고 싶다면) dependency:copy-dependencies 명령을 이용해서 가져올 수 잇다.

$emds-core> mvn dependency:copy-dependencies


이 명령은 프로젝트에서 참조하는 라이브러리들을 target/dependency 에 모두 복사해넣는다.
따라서 소스를 풀어서 재결합한 assembly 방식을 피하고 싶다면 이 명령과
package 명령을 통해 만들어진 프로젝트.jar 파일을 사용한다면 해당 프로젝트를 완전히 배포할 수 있다.

java.lang.OutOfMemoryError: Java heap space


maven 을 별도로 세팅하지 않고 대체로 war 패키지를 deploy 할 경우에 흔히 일어나는 현상이다.
war 의 경우 파일의 사이즈가 큰 편인데 jvm 옵션을 주지 않으면 완성된 war 를 deploy시 java.lang.OutOfMemoryError 가 나곤 한다.

이러한 일련의 문제는 jvm option 을 주므로서 해결할 수 있는데, 환경 변수에 MAVEN_OPTION 을 등록하면 된다.

나는 다음의 JVM_OPTION 을 MAVEN_OPTION 으로 등록하였다.

-XX:PermSize=32m -XX:MaxPermSize=128m -Xms128m -Xmx512m



pom.xml 의 build plugins 하위에 다음의 플러그인 속성을 추가한다.
이후에는 install 또는 deploy 시 자동으로 소스까지 같이 배포된다.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
       <executions>
       <execution>
<id>attach-sources</id>
<goals>
    <goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>


$Prompt>mvn deploy

  1. BlogIcon NYA 2009.11.18 17:00

    오홍 이 녀석이었군요. 저는 deploy 에 뭔가 옵션이 있을까 했는데... 별도 플러그인으로 execution 으로 넣는거네요. 근데 goal 이 deploy 가 아니라 jar 라서 갸우뚱 하게 되네요..

    • BlogIcon slothink 편현장 2010.03.17 10:46 신고

      만들어지는 결과물 형식에 대해서 goals 이 정해집니다. 그래서 결과물이 xxx-sources.jar 가 되지요. 만약 테스트 소스도 결과물을 만들어 내고 싶으면 <goals> 안에 <goal>test-jar</goal> 까지 넣으시면 된답니다. 메이븐을 쓰는 사람이 있으니 반갑네요^^

+ Recent posts