Birden çok src diziniyle Maven derlemesi


195

Tek bir maven projesinde birden fazla java kaynak dizinini derlemenin bir yolu var mı?

Yanıtlar:


279

Build-helper ile yeni bir kaynak dizin ekleyebilirsiniz:

<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
Bu yaklaşımla ilgili tek sorun, son yapının java kaynak dosyalarını da (.java dosyaları) içermesidir. Kaynak dosyaları hariç tutmanın ve yalnızca .class dosyalarını içermenin bir yolu var mı?
saravana_pc

18
diğerleri gibi sadece bir not (benim gibi), pluginöğe /project/build/plugins/project/build/pluginManagement/plugins
içeri

3
Tutulma kullanıyorsanız, m2e connector for build-helper-maven-pluginpom.xml'deki hatayı kaldırmak için tutulma pazarından yüklemek isteyebilirsiniz
dieend

1
Eğer böyle bir uyarı alırsanız'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missing<plugin><version>1.12</version>
Alphaaa

4
Yani bunu yapmanın en iyi yolu, 2017'de bir XML makarna oluşturmaktı. Kimse bununla ilgili bir sorun görmüyor mu?
Tom

55

Saf bir şekilde bu şekilde yaparım:

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

2
Benim için çalıştı :) Eclipse olsa gibi görünmüyor. "Src / main / java, src / interfaces" ifadesinin tek bir src olduğunu düşünüyor ve bu nedenle (eksik) olarak işaretliyor.
Joel

1
Benim için Maven 3.2.2'nin kaynak bulmamasına neden oldu.
user149408

39

Bu benim için çalıştı

<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
Çok iyi bir fikir IMHO değil, çünkü birkaç eklenti kaynak dosyaların kökleri olarak sourceDirectory- ve muhtemelen ek sources- varsayıyor . Çözümünüzde, maven-compiler-pluginbu gerçek köklerin farkında olan tek eklentidir.
Laurent Pireyn

3
@Laurent Bu konuda haklısın. Bu birkaç yıl önce iyi bir fikirdi ama şimdi çok daha iyi seçenekler var. Yukarıda listelenen build-helper tercih ettiğim seçenekler.
sal

5
Bu onu proje modeline eklemez, bu nedenle IDE'lerde düzgün çalışmaz.
David Phillips

+1 @sal, bir WAR projesi bağımlılığına sahip bir cazibe gibi çalıştı.
ATorras

1
Bir dış kaynak dizini (maven projemde kullandığım Java sınıfını içeren) eklemek istiyorsanız bu işe yaramaz. Harici kaynağım Eclipse çalışma alanımın dışındaysa ne olur? Ne yapabilirim?
Aerox

16

intelliJ'de çalışmasını sağlamak için

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

maven-derleyici-eklentisine


Bunun Eclipse'de çalıştığını ve oluşturulan kaynakları proje yapılandırmasında kaynak konum olarak eklemek için eklemek isterim.
Adam Hawkes

2
Bu yol, ek açıklama işlemcileri tarafından üretilen kaynaklar için görünüyor. Çalışsa bile, bu yolun bazı eklentiler tarafından farklı şekilde ele alınması mümkündür. Örneğin, 'temiz' çalıştırıldığında bu dizinin silinmesini beklerdim.
kapex

2
onu nereye koydun ?
Pavel Niedoba

10

Bu aynı zamanda kaynak etiketini tanımlayarak maven ile de çalışır. Src klasör adlarınızı istediğiniz gibi adlandırabilirsiniz.

    <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

Bu maven 3.5.4 ile çalıştı ve şimdi Intellij Idea bu kodu kaynak olarak görüyor:

       <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

Postadan build-helper-maven-eklentisini kullandık ve src / main / Ve mvn temiz derleme benim ../common/src/main/java, ya da ../common üzerinde çalışır, böylece ikincisi tuttu. Sonra evet, derlemenin IntelliJ IDEA (sürüm 10.5.2) seviyesinin David Phillips'in belirttiği gibi başarısız olduğunu doğrulamak. Sorun, IDEA'nın projeye başka bir kaynak kökü eklememesi idi. Manuel olarak eklemek sorunu çözdü. Projedeki herhangi bir şeyi düzenlemek, IDEA'nın proje seçeneklerinin doğrudan düzenlenmesinden değil, maven'den gelmesi gerektiği için hoş değil. Yine de, kaynakları otomatik olarak ekleyecek şekilde build-helper-maven-plugin'i doğrudan destekleyene kadar onunla yaşayabileceğim.

Sonra da bu işi yapmak için başka bir geçici çözüm gerekiyordu. Bir pom değişikliğinden sonra IDEA tekrar maven ayarlarını her içe aktardığından beri, yeni eklenen kaynak modülde tutuldu, ancak Kaynak Klasörleri seçimlerini kaybetti ve işe yaramadı. Yani IDEA için - bunları bir kez ayarlamanız gerekir:

  • Seç - Proje Ayarları / Maven / İçe aktarma / kaynak ve test klasörlerini yeniden içe aktarma sırasında sakla.
  • Ekle - Proje Yapısı / Proje Ayarları / Modüller / {Modül} / Kaynaklar / İçerik Kökü Ekle.

Şimdi bu klasörleri içe aktarmak, dünyanın en iyi uygulaması değil, ..., ama denemek.


Her iki seçenek de kullandığım IntelliJ Idea 9.0.4 ile çalışmıyor. Son Eclipse ile yapı yardımcısı seçeneklerini denemedim, ancak denediğimde 3.4 ve m2 eklentisi ile çalışmadı. Maven, birden fazla kaynak ağacını veya aynı projeden inşa edilen birden fazla eseri sevmez, bu sınırlamayı aşmaya yönelik herhangi bir girişim genellikle korkunç bir hack'tir.
sal

Uzun yıllardır IntelliJ'de. Ve hiçbir zaman tutulmaya geçmedi, bu yüzden konuşamadım, sonra da genellikle çok iyi olduğunu duydum. IntelliJ için Kişisel lisansı her iki yılda bir yükseltmek 100 $ / yıl'dır. Yeni ana sürümler genellikle her yıl Ocak ayında yayınlanmaktadır. Daha sonra bir önceki yılın son 2-3 ayında, önceki sürümü satın almanıza ve yeni bir sürüme yükseltme yapmanıza izin veriyorlar. Bu şu anda 10 satın almak ve 11 almak için "güvenli" zamanı. Ayrıca, JSP ve diğer kurumsal özelliklere ihtiyacınız yoksa, ücretsiz topluluk sürümünü kullanın.
arntg

2

Evokk'un cevabı temel olarak doğru olsa da, test sınıfları eksik . Hedef add-test-source ile test sınıfları eklemelisiniz :

                        <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

Bu iki adımda yapılabilir:

  • Her kaynak dizini için kendi modülünü oluşturmalısınız.
  • Tüm modüllerde aynı derleme dizinini belirtmelisiniz: ${build.directory}

Eğer başlatılan Jetty ( jetty:run) ile çalışıyorsanız, herhangi bir modülde (Maven, IDEA veya Eclipse ile) herhangi bir sınıfın yeniden derlenmesi Jetty'nin yeniden başlatılmasına neden olur. Değiştirilmiş kaynaklar için alacağınız aynı davranış.


1

Yapılandırmada kullanabilirsiniz <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>

bunlar derleyici eklentisinin 3.8.1 sürümü için mevcut tüm yapılandırmalardır. Farklı sürümler, kodunuzu -Xgenel mvn komutundan sonra çalıştırarak bulabileceğiniz farklı yapılandırmalara sahiptir . Sevmek

mvn clean install -X
mvn compiler:compile -X

ve kimlik veya hedef veya eklenti adıyla arama yapma Bu, diğer eklentilere de yardımcı olabilir. Eclipse, intelliJ tüm yapılandırmaları öneri olarak göstermeyebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.