Eclipse& maven输出目录

时间:2012-10-09 07:05:26

标签: eclipse maven-2

我正在使用eclipse juno& maven 2.2.1。

有没有一种简单的方法可以将eclipse输出文件夹与maven分开? 所以我想在目标目录中建立eclipse,并在target-maven目录中进行maclipse。

我尝试使用

 <directory>target-maven</directory>

在pom.xml中。

如果我在创建项目后这样做,它的工作正常 但是当从svn(没有.classpath .target ...只有src文件夹)恢复项目,然后是eclipse:eclipse时,一切都在target-maven中构建。

2 个答案:

答案 0 :(得分:1)

您可以为此创建different profiles。为Eclipse创建一个配置文件mvn-eclipse,为指定不同目标目录的命令行创建mvn-cmd。您需要在Eclipse启动配置中激活配置文件(选择Run as -> Maven Build ...,然后选择Profiles字段),或者create two different settings.xml。在一个你指定

  <activeProfiles>
    <activeProfile>mvn-eclipse</activeProfile>
  </activeProfiles>

和另一个

  <activeProfiles>
    <activeProfile>mvn-cmd</activeProfile>
  </activeProfiles>

您应该将包含mvn-cmd的设置文件命名为活动配置文件settings.xml,这样在命令行上使用maven时就不必进行任何更改。在Eclipse中,您可以通过Preferences -> Maven -> User settings指定设置。

但是我不建议这样做,因为在两个输出文件夹不同步时可能会遇到麻烦。所以一定要有充分的理由。

答案 1 :(得分:0)

按照第一个答案的排序,这是这样做的正当理由:

我正在尝试一个基于Maven的大型项目(200多个子项目),其中涉及最新的Scala(2.13),Eclipse不支持该项目。 Scala-IDE is effectively dead at 2.12。没有它,在Eclipse中进行干净的构建将删除Maven编译的Scala类,并彻底破坏所有内容。我不确定是否需要提及m2e也不可用。

因此,一切都以几行perl结束,以修复我的工作区。相信我,我尝试了许多其他方法。此解决方案仍然需要我在另一个脚本步骤中将已编译的Scala类提供给Eclipse,但这在当时并不是真正的问题。

此解决方案不会通过调整.classpath生成的mvn eclipse:eclipse文件来更改Maven的目录,而是Eclipse的输出文件夹。根据您的喜好将调用中的目标文件夹更改为setAttribute(...),然后在项目根目录中运行脚本。

#!/usr/bin/perl
use strict;
use XML::XPath;

my $files = [];
find_files( '.', '^\.classpath$', $files );

for my $file ( @$files ) {
    my $xp = XML::XPath->new( filename => $file );

    $xp->find( '/classpath/classpathentry[@kind="output"]' )
       ->[0]
       ->setAttribute( 'path', 'target-eclipse' );

    open my $ofh, '>', $file or die 'Cannot open for writing: '.$file;
    print $ofh $xp->getNodeAsXML;
    close $ofh;
}

sub find_files {
    my ( $path, $mask, $hits ) = @_;
    opendir my $dh, $path or die 'Cannot open path: '.$path;
    for my $entry ( grep { ! /^\.{1,2}$/ } readdir $dh ) {
        my $fullpath = $path.'/'.$entry;
        if ( -d $fullpath ) {
            find_files( $fullpath, $mask, $hits );
        } elsif ( $entry=~/$mask/ ) {
            push @$hits, $fullpath;
        }
    }
    closedir $dh;
}