有一个明确的解决方案,可以使用maven-antrun-plugin
插件的test-jar
目标在maven项目之间共享通用测试代码(请参见此处)。
我需要对测试资源做类似的事情,特别是,我希望在测试过程中项目A的测试资源在项目B的类路径中可用。
对于项目A,需要声明:
<!-- Package and attach test resources to the list of artifacts: -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<jar destfile="${project.build.directory}/test-resources.jar">
<fileset dir="${project.basedir}/test-resources" />
</jar>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${project.build.directory}/test-resources.jar</file>
<type>jar</type>
<classifier>test-resources</classifier>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
在项目B中,它将是正常依赖项:
<dependency>
<groupId>myproject.groupId</groupId>
<artifactId>myartifact</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>test-resources</classifier>
<scope>test</scope>
</dependency>
问题:是否在所有情况下都有效? 是否可以在没有maven-antrun-plugin
的情况下打包资源(使用更多的“轻量级”插件)?
我正在编写一个bash脚本来自动化构建过程。 有两个主要的构建块,一个是蚂蚁任务,一个是普通的mvn clean install
。当这两个构建过程中的任何一个发生构建错误时,我都想做些事情。
问题是,这些构建将不时包含测试失败或错误,但最终结果是成功的。 而且我相信这些过程返回的状态码($?)应该为0,无论构建失败还是成功,我都可能错了。
那么,对于我的脚本而言,检测最终结果(构建失败/成功)而不从中间构建捕获错误信息(测试错误等)的最佳方法是什么?
在CI构建服务器上,本地Maven存储库会重复(几天后)填充文件系统。在这种情况下,其他人正在采取什么策略来削减本地存储库?-最大
我继承了一个代码库:)
在src / test / java /下,有一个文件需要运行(我需要运行它的public static void main(String[] args)
,而不是其中的-Dexec.classpathScope="test"
方法)。
我最接近的是:
mvn -e exec:java -Dexec.mainClass="com.me.packagex.RunFile" -Dexec.classpathScope="test"
但这失败了,这似乎是因为RunFile想要使用src / main / java / com / me / packagex /下的类(请注意,/ main /,而不是/ test /)。 此处的文件与RunFile位于同一包中,即“ package com.me.packagex;”。
如果删除-Dexec.classpathScope="test"
,则根本找不到RunFile。 好像我需要给它两个作用域,但它不接受“测试,编译”。
我从(继承人)那里继承过来的人曾经从Eclipse运行它。 我需要一种从命令行运行它的方法。
我希望对此有清楚的解释。
TYVM,
这是有希望的。 帕斯卡(Pascal),我已经尝试了您的示例,但对我来说不起作用。
尽管现在我看着它-找不到Demo,而不是找到Dog。
Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_18
Java home: /usr/lib/jvm/java-6-openjdk/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-25-generic" arch: "i386" Family: "unix"
$ mvn -e exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test"
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] An exception occured while executing the Java class. com.stackoverflow.Demo
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:346)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
... 17 more
Caused by: java.lang.ClassNotFoundException: com.stackoverflow.Demo
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:284)
at java.lang.Thread.run(Thread.java:619)
我可以添加什么内容到pom.xml中,它将生成的WAR文件从目标目录复制到Tomcat的webapps
目录中?
我正在一个现有的,相当原始的Maven 2项目中使用协议缓冲区进行实验。 当前,每次需要更新生成的源代码时,我都会调用Shell脚本。 显然这很麻烦,因为我希望在每次构建之前自动生成源。 希望不要诉诸可耻的黑客。
因此,我的问题有两个:
远景:是否有Maven 2的“协议缓冲区插件”可以自动实现上述目标? Google Code上有一个分支,其作者似乎对实现这种插件有所帮助。 不幸的是,它还没有通过代码审查,也没有被合并到protobuf主干中。 因此,该插件的状态未知。
可能更现实:缺少一个实际的插件,我还应该如何从Maven 2构建中调用protoc
? 我想我可以将现有的Shell脚本连接到antrun
调用或类似的调用中。
个人经验受到高度赞赏。
假设我在本地计算机上有一个Maven 2 Java项目。 我构建了项目mvn eclipse:eclipse -DdownloadSources
文件,并使用mvn install
将其推送到我的本地Maven存储库中。
题:
如何强制Maven将项目源mvn eclipse:eclipse -DdownloadSources
推送到本地仓库?
如果在开发新项目时将上述项目用作依赖项,这将很有用,并且可以使用2993697164934775775808功能。
目前,我正在测试Gradle作为Maven的替代产品。 在我的项目中,有一些第3方jar,在任何(Maven)存储库中都没有。 现在的问题是,如何管理将这些jar安装到本地.gradle存储库中。 (如果可能,我不想使用本地Maven存储库,因为Gradle应该独立运行。)目前,由于缺少jar,我遇到了很多异常。 在Maven中,运行install命令非常简单。 但是,我在Google上搜索类似于Maven install命令的操作失败。 有人知道吗?
我在maven中有5个模块的项目。 现在,当我进行“ mvn全新安装”时,它将生成一个耳朵,其中包含两个罐子,一个war和一个来自其他模块的sar。
所有文件名都包含版本,例如projectx-ear-2.0.0.ear,projectx-client-2.0.0.jar等。
我需要重命名其中一个jars和最后一个耳朵,以省略文件名中的版本。 它看起来应该像这样:
projectx-ear.ear
|
+-- projectx-client.jar
|
+-- projectx-misc-2.0.0.jar
|
+-- projectx-sar-2.0.0.sar
|
\-- projectx-web-2.0.0.web
现在,我正在使用以下插件进行构建:Maven编译器插件和Maven发行插件
实现我期望的结果的最佳方法是什么?
我试图对驻留在WEB-INF目录中的应用程序上下文文件添加一些过滤。
我在/ src / main / resources文件夹中有要过滤的文件(xmlgateway-context.xml)。
我在src / main / filters文件夹中有属性文件(config-e05.properties)
我将POM设置如下:
<!-- environment profiles -->
<profiles>
<profile>
<id>e04</id>
<properties>
<targetenv>e04</targetenv>
</properties>
</profile>
<profile>
<id>e05</id>
<properties>
<targetenv>e05</targetenv>
</properties>
</profile>
</profiles>
<!-- build settings (filtering) -->
<build>
<filters>
<filter>src/main/filters/config-${targetenv}.properties</filter>
</filters>
<resources>
<resource>
<targetPath>WEB-INF</targetPath>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
这将正确安装mvn,但是当我打开输出war文件时,我期望文件xmlgateway-context.xml位于/ WEB-INF目录中,但最终位于文件夹/ WEB-INF / classes / WEB中 -INF。
我该如何将该文件放入正确的位置。
或者,我可以将应用程序上下文放到其他位置并在那里引用它。
Maven原型是“模板”,通过它们您可以快速生成给定框架或项目类型的运行示例。 我正在尝试编译当前在网络上活动的所有Maven原型目录的列表。
从有关目录文件的Maven文档中:
存储有关原型的知识 在目录中。
目录是xml文件。
原型插件捆绑在一起 内部目录。 这个是 默认使用。
原型插件可以使用目录 从本地文件系统和HTTP 连接。
到目前为止,我已经收集了确实发布目录的存储库列表,但是希望了解是否有人知道更多:
mvn archetype:generate
-DarchetypeCatalog=local
-DarchetypeCatalog=remote
-DarchetypeCatalog=http://repo.fusesource.com/maven2
-DarchetypeCatalog=http://cocoon.apache.org
-DarchetypeCatalog=http://download.java.net/maven/2
-DarchetypeCatalog=http://myfaces.apache.org
-DarchetypeCatalog=http://tapestry.formos.com/maven-repository
-DarchetypeCatalog=http://scala-tools.org
-DarchetypeCatalog=http://www.terracotta.org/download/reflector/maven2/
链接到相同:1)FuseSource2)茧3)Java.net4)MyFaces5)挂毯6)Scala目录7)兵马俑目录
您会注意到,如果存储库实际上发布了原型目录(上述所有内容都在做),您将获得一个UI提示,其中包含在archetype-catalog.xml
中找到的所有选择。例如:
mvn archetype:generate -DarchetypeCatalog=http://scala-tools.org
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: http://scala-tools.org -> scala-archetype-simple (A simple scala project)
2: http://scala-tools.org -> lift-archetype-blank (A blank/empty liftweb project)
3: http://scala-tools.org -> lift-archetype-basic (A basic liftweb project (with DB, css, ...))
Choose a number: (1/2/3):
例如,如果要直接查看Scala目录文件,则可以浏览到[http://scala-tools.org/archetype-catalog.xml]
但是,如果存储库未提供archetype-catalog.xml,则正如PascalT所说的那样,您需要事先知道名称(不太方便)并将其传递给命令行参数。
所以我在IntelliJ中有一个Maven模块(模块A)。 最近,我将一些类从其中移到了另一个新的Maven模块(模块B)中,并为其添加了依赖项。 完成此操作后,我还修改了其中一个移动类(现在位于模块B中)的方法的签名。
我重新导入了poms,以便IntelliJ拾取依赖项更改,并确保受影响的文件的所有Java导入都再次正确。 现在,当我尝试运行我的webapp(取决于两个模块)时,在模块A中的类中收到编译错误,并在模块B中调用该类的修改方法。
错误消息基本上是在说该方法不存在,但相信旧方法仍然存在! 我单击“ make”错误,然后将我带到模块A的类中的该行,调用了已修改的方法...奇怪的是,IntelliJ知道在文件中可以使用。 即该方法没有像通常会出现编译错误那样用红色下划线,但是类文件名是:(
我从命令行使用“ mvn install”(还安装了模块B)对其进行了编译,并且都成功了。 我已经删除了模块A和模块B的目标中的classes目录,并且使IntelliJ的缓存无效并重新启动了...仍然在发生...任何想法吗?
我正在使用其他插件(ant4eclipse)来存储我的文件。 避免执行maven-jar插件的最佳方法是什么?
<skip>true</skip>
<skip>true</skip>
<skip>true</skip>
没有工作
我有一个带有模块的Maven项目
/myProject
pom.xml
/myModule
pom.xml
/foo
bar.txt
考虑一下myModule中的Junit,它需要打开bar.txt,使用maven的basedir是模块目录。
所以打开文件bar.txt:
new File("foo/bar.txt")
当您在intellij中启动相同的junit时执行myProject/foo/bar.txt
BUT时,此方法效果很好,因为Intellij在项目目录而不是模块目录中设置了basedir,所以失败。
Intellij尝试打开myProject/foo/bar.txt
而不是myProject/myModule/foo/bar.txt
有办法解决吗?
我希望Maven将项目与运行时依赖项一起打包。 我希望它使用以下清单创建一个JAR文件:
.....
Main-Class : com.acme.MainClass
Class-Path : lib/dependency1.jar lib/dependency2.jar
.....
并创建以下目录结构:
target
|-- ....
|-- my-project.jar
|-- lib
|-- dependency1.jar
|-- dependency2.jar
含义是,我希望主JAR排除任何依赖关系,并且希望将所有传递性依赖关系复制到“ lib”子目录中。 有任何想法吗?
我试图这样做以从我的WAR文件中排除整个目录($ {basedir} / src / main / webapp / webscripts),但失败了。 怎么了?
这不起作用:
<configuration>
<webResources>
<resource>
<directory>${basedir}/src/main/webapp/webscripts</directory>
<excludes>
<exclude>**/*.*</exclude>
</excludes>
</resource>
</webResources>
</configuration>
这个也是:
<configuration>
<webResources>
<resource>
<directory>${basedir}/src/main/webapp</directory>
<excludes>
<exclude>**/webscripts</exclude>
</excludes>
</resource>
</webResources>
</configuration>
有人可以帮忙吗?
我将Maven约定用于源路径(src / main src / test),并且我的sql脚本位于src / main / resources / scripts中。
我想用H2内存运行我的应用程序,我想使用jdbc url初始化我的数据库:
database.url=jdbc:h2:mem:;INIT=RUNSCRIPT FROM 'src/main/resources/scripts/create.sql';
我的问题是,此相对路径(src / main / ...)不起作用,并且如果init = runscript命令没有任何作用,则H2不会崩溃。
有人知道我应该使用什么方法来完成这项工作吗?
谢谢
我对Maven并不陌生,我经常发现自己想看看目标方面的实际情况。
因此,是否有一个命令列出了所有可用的目标,例如 给定前缀?
我有多个问题。
我可以在当前项目上执行mvn命令时混合另一个项目的目标吗?
例如:mvn clean -otherproject comple-otherproject instal-otherproject compile-thisproject
我可以使用多个mvn命令执行此操作,但是可以在单个maven命令中执行此操作。