2012-03-27 4 views
0

Google은 구글 코드 (SVN)와 ANT (빌드 작업)에서 git (GitHub) 및 maven으로 이동 한 오픈 소스 프로젝트 (ps3mediaserver)에 참여하고 있습니다. 나는 내 자신의 포크 (pms-mlx라고 불린다.)를 가지고 있는데, 내가 풀어 놓을 때 기본 꾸러미의 일부인 일부 플러그인을 유지하고 싶다. 저는 꽤 새로운 프로젝트입니다. 프로젝트가 어떻게 메이븐 웨이를 존중하도록 구조화되어야하는지 너무 확신하지 못합니다.
환경이 이전에 어떻게 작동했는지부터 설명하고 시작하여 Maven으로 이동하는 것에 대한 생각을 전합니다.멀티 플랫폼 멀티 모듈 메이븐 프로젝트 패키징

링크 :

이전 동작 :

프로젝트 구조 :

+--workspace 
     +--plugins 
      +--plugin1 
      build.xml 
      +--plugin2 
      build.xml 
     +--ps3mediaserver_mlx 
      +--plugins 
      build.xml 

주요 프로젝트는 ps3mediaserver_mlx되어, 모든 플러그인은 작업 공간/플러그인 폴더의 하위 폴더에 살고 있습니다.
ps3mediaserver_mlx/build.xml에는 기본 프로젝트의 jar 파일을 빌드하고 workspace/pms_no_libs.jar 파일로 복사 한 후이 위치에서 플러그인으로 참조 할 대상 BuildWithoutLibs가 있습니다.
플러그인의 빌드 대상을 실행할 때 플러그인이 빌드되고 결과 jar가 ps3mediaserver_mlx/plugins/[plugin_name] .jar로 복사됩니다.
마지막으로 ps3mediaserver_mlx/build.xml에서 빌드 대상을 사용하여 응용 프로그램을 패키징하면 workspace/ps3mediaserver_mlx/plugins에 포함 된 플러그인이 패키징됩니다 (Windows의 경우 exe 설치 프로그램에서, OSX의 경우 dmg 또는 Linux의 경우 tar.gz) .

새로운 동작은 프로젝트 구조는 변경되었습니다 :

+-- workspace/ 
+-- pom.xml (global-pom) 
+-- ps3mediaserver/ 
| +-- pom.xml (pms-pom) 
| +-- src/ 
|   ... 
+-- plugins/ 
| +-- pom.xml (plugins-pom) 
| +-- Plugin1/ 
     | pom.xml (plugin1-pom) 
     | src/ 
| +-- Plugin2/ 
     | pom.xml (plugin2-pom) 
     | src/ 
+-- pms-package/ 
    +-- pom.xml (package-pom) 
    +-- src/main/assembly/ 
    +-- src/main/external-resources/ 

Responsabilities을 : PMS에 의해 사용되는 모든 종속성을 포함
global-pom 루트 치어. 이렇게하면 플러그인에서 다시 선언하지 않고 동일한 버전을 사용할 수 있습니다 (좋은 생각입니까?). 모든 것을 구축하고 모든 프로젝트

<modules> 
    <module>ps3mediaserver</module> 
    <module>plugins</module> 
    <module>pms-package</module> 
</modules> 

pms-pom에서 같은 받는다는 명령을 수행하는 모듈 섹션을 포함하십시오 PMS가

plugins-pom 항아리 andbuilds 글로벌 치어로부터 상속 : 글로벌 치어로부터 상속; pms에 대한 의존성을 포함합니다 (모든 플러그인에 필요합니다).

를 구축 할 필요가 모든 모듈의 목록을 포함

pluginX - 치어는 : 플러그인 - 치어로부터 상속 및 플러그인

package-pom에 대한 사용자 정의 구성을 포함 :이 건설되고있다 플랫폼에 따라 PMS를 포장하는 책임인가 에.

이 구조는 사용할 수있는 방법을 나타 냅니까?

모든 것이 포장되어 있습니다. 즉, 주요 응용 프로그램 jar뿐만 아니라 모든 플러그인을 빌드하고 패키지해야합니다. package-pom이 그렇게 할 책임이 있습니다.
원래 응용 프로그램에는 pom.xml이 하나만 있고 포장은 Windows, Linux 및 OS X 용으로 다른 프로필을 사용하여 수행됩니다. 현재 내가 작업하고있는 것은 OSX 용이며 osxappbundle-maven-plugin을 사용하지만 소스 코드는 절대로 사용하지 않습니다. 앱 파일에 패키지되어 있습니다. 패키징 프로젝트가 더 이상 실제 프로젝트를 상속하지 않기 때문입니다.
응용 프로그램 파일에 올바르게 패키지화하기 위해 빌드 된 jar 파일을 참조하려면 어떻게해야합니까?
additionalResources에서 jar를 참조하고 사용자 정의 클래스 경로로 시도했지만 성공하지 못했습니다.

+0

내가 알아 차린 첫 번째 사실은 당신이 당신의 pom에 Maven의 모범 사례에 반대되는 많은 저장소를 정의했다는 것입니다. – khmarbaise

+0

아티팩트를 만들지 않은 것에 대한 여러분의 의견 중 일부는 잘못되었습니다 : http://search.maven.org/#search%7Cga%7C1%7Ccom.jgoodies – khmarbaise

+0

다음으로 루트 폴리에서 의존성을 정의하면 안됩니다 의존성 관리 블록에서. (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html). – khmarbaise

답변

1

당신은 정확하게 당신의 부모를 나타내는 플러그인/pom.xml 파일

<dependencies> 
    <dependency> 
    <groupId>net.pms</groupId> 
    <artifactId>pms-mlx</artifactId> 
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

예에 대한 종속성을 정의했습니다. 즉, 이미 부모로 정의 된 종속성을 정의하는 것은 잘못입니다.

modelVersion 태그를 프로젝트 태그 바로 뒤에 부모 태그 앞에 두는 것이 좋습니다. 상위 태그 다음에 정보를 artifactId와 같은 현재 모듈에 넣습니다. 멀티 모듈에 대한 받는다는 방법에 대해입니다

<modelVersion>4.0.0</modelVersion> 
<artifactId>WebservicePlugin</artifactId> 
<version>3-SNAPSHOT</version> 
<packaging>jar</packaging> 

<parent> 
    <groupId>net.pms</groupId> 
    <artifactId>pms-plugins</artifactId> 
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version> 
</parent> 

빌드 :

프로젝트로 다이빙을 한 후 난 당신이 당신의 플러그인/WebservicePlugin의에 정의 된 것으로 나타났습니다. 이 경우 다른 버전을 정의해서는 안됩니다. 그것은 다음과 같아야합니다

<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>net.pms</groupId> 
    <artifactId>pms-plugins</artifactId> 
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version> 
</parent> 
<artifactId>WebservicePlugin</artifactId> 

당신이 (뿐만 아니라 다른 플러그인 될 수있다) 나머지에서 WebservicePlugin 분리에 대해 생각해야보다 WebservicePlugin 모듈의 버전에 따라 문제가있는 경우.

다른 많은 것들 (많은 플러그인이 아닌 경우)과 maven-compiler-plugin의 구성 및 사용법을 많은 플러그인에서 정의했음을 알았습니다. 플러그인 관리 파트를 사용하여이 작업을 수행해야합니다 프로젝트의 유지 보수를 위해

생성 된 플러그인 - 항아리를 maven-antrun 플러그인을 통해 다른 위치로 복사하는 작업이 다르게 수행 될 수 있습니다. 모든 플러그인에서 라이센스 항목을 반복하는 것은 부모가 상속하므로 필요하지 않습니다.

+0

설명해 주셔서 감사합니다! 과정의 모든 잘못으로 그것을 고치기 위해 약간의 시간이 걸릴 것이다;) 나는 특정 부분과 다른 프로젝트의 주 프로젝트를 담당한다. – Philippe