Maven2에서는 전쟁을 건설하는 가장 간단한 방법은 무엇입니까? 단일 POM에 전쟁을 담을 수있는 귀는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1870149

문제

상황은 매우 간단합니다. Maven으로 구축되도록 변환하는 Java WebApp이 있습니다. 현재,이 앱은 ANT로 단일 전쟁 파일로 제작 된 다음 매우 간단한 Application.xml로 귀에 묶여 있습니다.

maven-war-plugin 그리고 maven-ear-plugin 둘 다 나에게 매우 간단 해 보이며, 전쟁 프로젝트를 귀 프로젝트의 의존성으로서 위의 두 가지 프로젝트로 고려해야 할 것으로 보인다. 특히 전쟁 프로젝트의 프로파일 설정이 각 환경에 대해 변경 될 것이기 때문에 이것은 불편 해 보입니다. 이는 귀를 만들려고 할 때마다 조정하는 것을 중복시키는 것처럼 보입니다.

이 모든 것 : 전쟁을 만들고이 사소한 단순한 귀에 그것을 패키지하는 간단한 방법이 있습니까? 나는 이것들을 두 개의 별도 프로젝트로 유지하지 않기를 원하지만이를 달성하기 위해 어셈블리를 사용하여 지나치게 지저분한 해킹에 의지하지 않는 것을 선호합니다.

도움이 되었습니까?

해결책

이 모든 것 : 전쟁을 만들고이 사소한 단순한 귀에 그것을 패키지하는 간단한 방법이 있습니까? 나는 이것들을 두 개의 별도 프로젝트로 유지하지 않기를 원하지만이를 달성하기 위해 어셈블리를 사용하여 지나치게 지저분한 해킹에 의지하지 않는 것을 선호합니다.

짧은 대답: 아니요, "프로젝트 당 하나의 아티팩트"인 Maven 규칙에 위배 될 것이므로 간단한 maven-way는 없습니다 (프로젝트 당 하나의 출력을 이해하는 경우 99%에서 사실입니다).

그리고 실제로, 나는 강력히 추천합니다 ~ 아니다 해킹 방식으로 가서 어셈블리를 사용하여 귀를 만듭니다. 대신, 하나는 유형의 포장으로 두 개의 모듈을 만듭니다. war, 다른 하나는 유형의 포장이 있습니다 ear 전쟁 인공물에 따라 부모의 모듈로 선언합니다. pom.xml. 이와 같이:

my-project
|-- pom.xml       // packaging of type pom and my-war and my-ear as modules
|-- my-war
|   `-- pom.xml   // packaging of type war
`-- my-ear
    `-- pom.xml   // packaging of type ear

Maven에 가서 Maven Philosophy를 입양하고 싸우지 말고 많은 고통을 구할 수 있습니다. 진지하게, Maven-ear-Plugin이 이미하고있는 일을하기 위해 어셈블리를 해킹하는 것은 단지 방향으로 건조합니다. 이 경우 개미를 고수하는 것이 좋습니다.

다른 팁

나는 이것이 5 살이라는 것을 알고 있지만, 내가 검색했을 때 처음으로 나온 첫 번째 대답이었다. 또한, "Maven Way가 아닙니다"는 어떤 사람들에게는 완벽하게 합리적인 답변이지만, 다른 사람들은 OP가 요청한대로 단일 POM을 사용하는 것을 선호 할 수 있으며 실제로 그렇게 복잡하지는 않습니다.

먼저, 표준 전쟁 pom.xml을 만들어 귀에 포함하려는 전쟁 파일을 생성하십시오. 포장을 전쟁으로 남겨 두십시오.

그런 다음 전쟁 파일 이름에 대한 자리 표시자를 사용하여 자신의 application.xml (src/main/application 또는 어디에서) 작성하십시오.

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>

같은 위치에 다른 서버 특정 XML 파일 (Weblogic-Application.xml 등)을 포함시킵니다.

다음으로 자리 표시자를 전쟁 파일 이름으로 바꾸는 리소스 섹션을 추가하십시오.

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

마지막으로, 귀를 내기 위해 개미 귀 작업을 추가하십시오.

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

그리고 그게 다야.

Maven에서 모든 단일 프로젝트는 aritifact를 생성합니다. 당신의 상황에서 나는 전쟁을위한 두 개의 프로젝트 1과 귀를 위해 하나를 만드는 것이 좋습니다. MutlTiple 버전의 프로젝트가 필요한 경우 분류기와 프로파일을 사용하여 해당 해당을 달성 할 수 있습니다.

이것은 Richfaces 예제 Pom의 발췌입니다.

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

귀 POM에서 프로파일을 사용하여 적절한 분류기로 필요한 종속성을 가져옵니다.

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top