여러 src 디렉토리로 Maven 컴파일


195

단일 maven 프로젝트에서 여러 Java 소스 디렉토리를 컴파일하는 방법이 있습니까?

답변:


279

build-helper를 사용하여 새 소스 디렉토리를 추가 할 수 있습니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>src/main/generated</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2
이 방법의 유일한 문제는 최종 아티팩트에 Java 소스 파일 (.java 파일)도 포함된다는 것입니다. 소스 파일을 제외하고 .class 파일 만 포함하는 방법이 있습니까?
saravana_pc

18
다른 사람들 (나 같은)을위한 메모, plugin요소는 존재 /project/build/plugins하지 않습니다/project/build/pluginManagement/plugins
Betlista

3
일식을 사용하는 경우 m2e connector for build-helper-maven-plugin일식 시장에서 설치 하여 pom.xml의 오류를 제거 할 수 있습니다.
dieend

1
다음과 같은 경고가 표시 되면 태그 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missing내에 추가해야합니다<plugin><version>1.12</version>
Alphaaa

4
2017 년에이를 수행하는 가장 좋은 방법은 XML 파스타를 만드는 것입니다. 아무도 그 문제를 보지 못합니까?
Tom

55

나는 순진하게 이렇게합니다 :

<build>
  <finalName>osmwse</finalName>
  <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
</build>

2
나를 위해 일한 :) Eclipse는 그것을 좋아하지 않는 것 같습니다. "src / main / java, src / interfaces"는 하나의 src라고 생각하는 것 같습니다.
Joel

1
나를 위해 Maven 3.2.2는 소스를 찾지 못했습니다.
user149408

39

이것은 나를 위해 일했다

<build>
    <sourceDirectory>.</sourceDirectory>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
        <includes>
            <include>src/main/java/**/*.java</include>
            <include>src/main2/java/**/*.java</include>
        </includes>
        </configuration>
        </plugin>
    </plugins>
</build>

19
아니 그런 좋은 아이디어 이럴 여러 플러그인 가정부터 sourceDirectory- 그리고 아마도 추가 sources- 소스 파일의 뿌리로. 귀하의 솔루션에서 maven-compiler-plugin이러한 실제 루트를 인식하는 유일한 플러그인입니다.
Laurent Pireyn

3
@Laurent 당신이 맞습니다. 이것은 몇 년 전에 좋은 생각 이었지만 지금은 더 나은 옵션이 있습니다. 위에 나열된 빌드 도우미는 내가 선호하는 옵션입니다.
sal

5
이것은 프로젝트 모델에 추가되지 않으므로 IDE에서 올바르게 작동하지 않습니다.
David Phillips

+1 @sal WAR 프로젝트 의존성을 가진 매력처럼 작동했습니다.
ATorras

1
외부 소스 디렉토리 (내 maven 프로젝트에서 사용중인 Java 클래스 포함)를 포함하려는 경우 작동하지 않습니다. 외부 소스가 Eclipse 작업 공간 외부에있는 경우 어떻게합니까? 어떡해?
Aerox

16

intelliJ에서 작동하도록 추가 할 수도 있습니다.

<generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>

maven-compiler-plugin에


프로젝트 구성에서 생성 된 소스를 소스 위치로 추가하기 위해 Eclipse에서 작동했음을 추가하고 싶습니다.
Adam Hawkes

2
이 경로는 주석 프로세서에 의해 생성 된 소스를위한 것 같습니다. 작동하더라도 일부 플러그인에서이 경로를 다르게 처리 할 수 ​​있습니다. 예를 들어 'clean'이 실행될 때이 디렉토리가 삭제 될 것으로 예상합니다.
kapex

2
어디에 두었습니까?
Pavel Niedoba

10

또한 resources 태그를 정의하여 maven과 함께 작동합니다. 원하는대로 src 폴더 이름을 지정할 수 있습니다.

    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/generated</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

8
maven.apache.org/pom.html#Resources- >Resources are not (usually) code. They are not compiled
SJuan76

4

이것은 maven 3.5.4에서 작동했으며 이제 Intellij Idea는이 코드를 소스로 봅니다.

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>                    
            </configuration>
        </plugin>

2

포스트에서 build-helper-maven-plugin을 사용하고 src / main / generated를 업데이트하십시오. 그리고 mvn clean compile은 내 ../common/src/main/java 또는 ../common에서 작동하므로 후자를 유지하십시오. 그런 다음 David Phillips가 언급했듯이 IntelliJ IDEA (버전 10.5.2) 수준의 컴파일이 실패했음을 확인합니다. 문제는 IDEA가 프로젝트에 다른 소스 루트를 추가하지 않았다는 것입니다. 수동으로 추가하면 문제가 해결되었습니다. 프로젝트에서 아무것도 편집하는 것은 IDEA의 프로젝트 옵션을 직접 편집하는 것이 아니라 maven에서 가져 오는 것이 좋지 않습니다. 그러나 소스를 자동으로 추가하도록 build-helper-maven-plugin을 직접 지원할 때까지 계속 사용할 수 있습니다.

그런 다음이 작업을 수행하기 위해 다른 해결 방법이 필요했습니다. pom 변경 후 IDEA가 maven 설정을 다시 가져올 때마다 새로 추가 된 소스가 모듈에 유지되었지만 소스 폴더 선택 항목이 손실되고 쓸모가 없었습니다. 따라서 IDEA의 경우 다음을 한 번 설정해야합니다.

  • -프로젝트 설정 / Maven / 가져 오기 / 소스 및 테스트 폴더를 다시 가져올 때 선택하십시오.
  • 추가-프로젝트 구조 / 프로젝트 설정 / 모듈 / {모듈} / 소스 / 컨텐츠 루트 추가.

이제 해당 폴더를 가져 오기 상태로 유지하는 것이 세상에서 가장 좋은 방법은 아니지만 시도해보십시오.


어느 옵션도 IntelliJ Idea 9.0.4에서 작동하지 않습니다. 최근 Eclipse에서 빌드 도우미 옵션을 시도하지 않았지만 3.4 및 m2 플러그인에서 작동하지 않았습니다. Maven은 동일한 프로젝트에서 빌드 된 여러 소스 트리 나 여러 아티팩트를 좋아하지 않습니다. 이러한 제한을 극복하려는 시도는 대개 끔찍한 해킹입니다.
sal

수년 동안 IntelliJ를 사용해 왔습니다. 그리고 일식으로 전환하지 않았으므로 이야기 할 수 없으며 일반적으로 매우 좋습니다. IntelliJ의 경우 1 년마다 개인 라이센스 업그레이드는 $ 100 / 년입니다. 새로운 주요 버전은 일반적으로 매년 1 월에 출시됩니다. 그런 다음 전년도 마지막 2-3 개월에 그들은 이전 버전을 구매하고 다음 버전으로 무료 업그레이드를 할 수 있습니다. 지금은 10 달러를 구매하고 11을 얻는 것이 "안전한"시기입니다. 또한 JSP 및 기타 엔터프라이즈 기능이 필요하지 않은 경우 무료 커뮤니티 에디션을 사용하십시오.
arntg

2

evokk의 대답은 기본적으로 정확하지만 테스트 클래스 가 없습니다 . 목표 add-test-source를 사용 하여 테스트 클래스를 추가해야합니다 .

                        <execution>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-test-source</goal>
                            </goals>
                            <configuration>
                                <sources>
                                    <source>target/generated/some-test-classes</source>
                                </sources>
                            </configuration>
                        </execution>

1

두 단계로 수행 할 수 있습니다.

  • 각 소스 디렉토리마다 고유 한 모듈을 작성해야합니다.
  • 모든 모듈에서 동일한 빌드 디렉토리를 지정해야합니다. ${build.directory}

시작된 Jetty ( jetty:run)로 작업하는 경우 모든 모듈 (Maven, IDEA 또는 Eclipse 포함)에서 클래스를 다시 컴파일하면 Jetty가 다시 시작됩니다. 수정 된 리소스에 대해 동일한 동작을 수행합니다.


1

구성에서을 사용할 수 있습니다 <compileSourceRoots>.

oal:          org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-cli)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <basedir default-value="${basedir}"/>
  <buildDirectory default-value="${project.build.directory}"/>
  <compilePath default-value="${project.compileClasspathElements}"/>
  <compileSourceRoots default-value="${project.compileSourceRoots}"/>
  <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
  <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
  <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
  <debug default-value="true">${maven.compiler.debug}</debug>
  <debuglevel>${maven.compiler.debuglevel}</debuglevel>
  <encoding default-value="${project.build.sourceEncoding}">${encoding}</encoding>
  <executable>${maven.compiler.executable}</executable>
  <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
  <failOnWarning default-value="false">${maven.compiler.failOnWarning}</failOnWarning>
  <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
  <fork default-value="false">${maven.compiler.fork}</fork>
  <generatedSourcesDirectory default-value="${project.build.directory}/generated-sources/annotations"/>
  <maxmem>${maven.compiler.maxmem}</maxmem>
  <meminitial>${maven.compiler.meminitial}</meminitial>
  <mojoExecution default-value="${mojoExecution}"/>
  <optimize default-value="false">${maven.compiler.optimize}</optimize>
  <outputDirectory default-value="${project.build.outputDirectory}"/>
  <parameters default-value="false">${maven.compiler.parameters}</parameters>
  <project default-value="${project}"/>
  <projectArtifact default-value="${project.artifact}"/>
  <release>${maven.compiler.release}</release>
  <session default-value="${session}"/>
  <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
  <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
  <skipMain>${maven.main.skip}</skipMain>
  <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
  <source default-value="1.6">${maven.compiler.source}</source>
  <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
  <target default-value="1.6">${maven.compiler.target}</target>
  <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
  <verbose default-value="false">${maven.compiler.verbose}</verbose>
</configuration>

이들은 컴파일러 플러그인 3.8.1 버전에서 사용 가능한 모든 구성입니다. 버전마다 -X일반 mvn 명령 다음에 코드를 실행하여 찾을 수있는 구성이 다릅니다 . 처럼

mvn clean install -X
mvn compiler:compile -X

ID 또는 목표 또는 플러그인 이름으로 검색 다른 플러그인에도 도움이 될 수 있습니다. Eclipse, intelliJ는 모든 구성을 제안으로 표시하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.