我开发了一个Java实用程序库(类似于Apache Commons),我在各种项目中使用它.除了胖客户端,我还将它用于移动客户端(具有J9 Foundation配置文件的PDA).随着时间的推移,作为单个项目启动的库分布在多个包中.因此,我最终得到了许多功能,这在所有项目中并不是真正需要的.
由于这个库也用在一些移动/ PDA项目中,我需要一种方法来收集使用过的类并生成实际的专用jar.
目前在使用此库的项目中,我有Ant jar任务,从(从实用程序项目)生成专用jar文件(例如:my-util-1.0-pda.jar,my-util-1.0-rcp.jar)使用include/exclude jar任务功能.由于生成的jar文件的大小限制,对于移动项目,这通常是需要的.
现在迁移到Maven我只是想知道是否有任何最佳实践可以达到类似的目的.我考虑以下场景:
[1] - 除了主jar工件(my-lib-1.0.jar)之外,还在my-lib项目中使用Maven Jar插件使用分类器(例如:my-lib-1.0-pda.jar)生成单独/专用工件或Maven Assembly Plugin过滤/包含.我对这种方法不太满意,因为它污染了库,消费者需要(过滤器).
[2] - 为所有专门的客户端/项目创建额外的Maven项目,这将"包装""my-lib"并生成过滤的jar工件(例如:my-lib-wrapper-pda-1.0 ......等) .因此,这些包装器项目将包括过滤(以生成过滤的工件),并将仅依赖于"my-lib"项目,客户端项目将依赖于my-lib-wrapper-xxx-1.0而不是my- lib-1.0.这种方法可能看起来有问题,因为即使这样也会让"my-lib"项目完整(没有额外的分类器和工件),基本上会使项目数量增加一倍,因为对于每个客户端项目我都会有一个lib,只是为了收集所需的来自"my-util"库的类("my-pda-app"项目将需要一个"my-lib-wrapper-for-my-pda-app"项目/依赖项).
[3] - 在每个使用该库的客户端项目中(例如:my-pda-app)添加一些专门的Maven插件来修剪(当生成最终的工件/包时)不需要的类(例如:maven-assembly) -plugin,maven-jar-plugin,proguard-maven-plugin).
在"Maven方式"中解决此类问题的最佳实践是什么?
我Error reading assemblies: No assembly descriptors found在构建项目时得到了.我正在尝试为我的.sh文件设置权限并排除一个.jar让我的应用程序崩溃的令人讨厌的文件...我不认为问题是关于那个......
我的maven-assembly插件在我的pom.xml文件中添加如下:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我的程序集描述符如下所示:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>my-assembly-descriptor</id>
<formats>
<format>jar</format>
<format>war</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${project.build.directory}</outputDirectory>
<includes>
<include>*.sh</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<excludes>
<exclude>spring-2.5.4.jar</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
我项目中的结构是:
Interface - src - main - assembly - src.xml
- pom.xml
Run Code Online (Sandbox Code Playgroud)
当尝试运行 - >调试为 - >然后在目标推送
assembly:single
我犯了同样的错误.我在控制台试了一下 …
我正在使用maven程序集插件生成一个.tar包含其他几个文件的文件,依赖的jar.所有文件都正确地复制到配置中的给定文件夹assembly.xml.
我想在最终的tar文件中包含原始项目jar,但目前还没有看到它.
我发布assembly:single目标时会收到以下消息:
[警告]不能包含项目工件:com.my.newpkg.project1:jar:0.0.3.0; 它没有关联的文件或目录.
在阅读了SO之后,似乎添加了以下配置pom.xml应该添加jar,但仍然没有得到预期的结果.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>com.my.newpkg.project1.MainClass</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
<formats>
<format>dir</format>
<format>tar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
<excludes>
<exclude>junit:junit</exclude>
</excludes>
<fileMode>0755</fileMode>
</dependencySet>
</dependencySets>
Run Code Online (Sandbox Code Playgroud)
那么,配置还不正确吗?还是我错过了什么?
我们如何将当前项目jar添加到最终的tar中
我有一个Maven项目,我想从中创建两个可执行的jar文件.一个将由用户以交互方式使用,另一个将作为预定作业运行,该作业读取前者生成的日志文件.最后,我希望除了MANIFEST.MF文件中的Main-Class属性之外,两个jar文件是相同的.
我正在使用maven-antrun-plugin创建一个可执行jar,这似乎工作正常,直到我尝试通过引入Maven配置文件创建第二个jar文件.我的POM文件的相关部分如下所示:
<profiles>
<profile>
<id>publisher</id>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
...
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}</finalName>
<archive>
<manifest>
<mainClass>fully.qualified.path.Publisher</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>logReader</id>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
...
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-logReader</finalName>
<archive>
<manifest>
<mainClass>fully.qualified.path.LogReader</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)
实际上,两者之间的唯一区别是插件中定义的"finalName"和"mainClass"元素.
当我尝试在两个配置文件上执行mvn:package时(顺便说一句,我使用IntelliJ IDEA),我得到两个.jar文件,但是一个是正确的,另一个是不正确的."正确"的包含所有依赖项和有效的MANIFEST.MF文件."不正确"的一个不包含依赖项,MANIFEST.MF文件缺少我需要的"Main-Class"属性,以使其可执行.
我发现,如果我只运行一个配置文件或另一个配置文件,它工作正常但是,如果我尝试一次执行两个配置文件,它会失败.我的日志中也有以下注释,但我必须承认我并不完全理解他们的意思:
[INFO] Building jar: .../target/publisher.jar
...
[INFO] …Run Code Online (Sandbox Code Playgroud) 我有一个有多个主要类的maven项目.我想从这些项目中生成可运行的Jars(包括所有依赖项).我目前有以下构建配置(使用maven.assembly):
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>classpath.to.my.mainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
他们是用maven-assembly来实现这个目标的吗?如果没有,实现目标的最简单方法是什么?
Maven的程序集插件可以创建一个大jar,包括所有与descriptorRef的依赖关系jar-with-dependencies.
如何排除其中一些依赖?好像它没有这样的配置?还有其他解决方案吗?
在Maven的标准目录布局说,脚本应放置在src/main/scripts一个Maven项目.除了"约定优于配置"的优点之外,还有其他优势吗?我有一个使用程序集插件构建可执行jar-with-dependencies的项目.还有一些有用的脚本随之而来.是否有任何工具可以利用此布局来构建其他内容,例如,包含jar和这些脚本的存档在合理的位置?
[更新]事实上,我甚至会说,将脚本放入src/main/scripts是不利的,就使用maven-assembly插件而言.看来一切都在/src/main(src/main/java当然除外)被复制到jar-with-dependencies的根目录,与src/main/resources此一样,这很有用.但是没有充分的理由在jar中加入脚本,尽管它没有特别的危害.如果,代替将它们放置在src/main/scripts一它们放在src/scripts(类似于标准src/assembly,这也不包括),那么它们不是复制到罐子,并且可以通过该组件的插件的稍后运行被复制到一个更大的存档.
更新:似乎我们必须区分从java代码中启动的运行时脚本和启动jar或执行其他操作的其他脚本.对于前者,将它们放入src/main/scripts可能是合适的.对于后者,不合适.
更新:该src/main/scripts目录已从标准目录布局文档中删除,因为它具有误导性.(然而遗留物仍然留在POM简介中,因为它与project.build.scriptSourceDirectory物业有关.)
我使用maven-assembly-plugin v2.5.3并得到以下错误
[INFO] Reading assembly descriptor: src/main/assembly/distributive.zip.xml
[ERROR] OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference (starting with slash) /
Run Code Online (Sandbox Code Playgroud)
但构建是成功的.这个错误是什么意思?
我在这个问题上发现了它.
我们使用Hudson和maven-release-plugin来完成发布版本.现在我有一个项目,其中包含一个程序集,它将所有需要的组件放在一起,然后将它们打包成一个带有所需目录结构的.tar.gz包.
现在我正在尝试使用release-plugin在发布期间将此包部署到我们的Maven存储库:执行目标,但只部署了标准的东西(sources,javadoc,POM).
我已经将汇编目标绑定到maven包阶段,而.tar.gz在发布期间进行构建,但没有上传到存储库.我在这里做错了什么提示?
这是assembly-plugin配置:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/distribution.xml</descriptor>
</descriptors>
<finalName>${pom.artifactId}-${pom.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<tarLongFileMode>warn</tarLongFileMode>
</configuration>
<executions>
<execution>
<id>dist-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我运行以构建版本的命令是
mvn release:prepare release:perform release:clean
Run Code Online (Sandbox Code Playgroud) deployment maven-2 maven-assembly-plugin maven-release-plugin
这是pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-js-resources-thin</artifactId>
<version>2.2.1.RELEASE</version>
<name>Spring js lib</name>
<description>Spring javascript library without dojo</description>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
这是 assembly.xml
<assembly>
<id>js-jar</id>
<formats>
<format>jar</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/resources/</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>META-INF/**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
问题是,每当我打开生成的jar文件(spring-js-resources-thin-2.2.1.RELEASE-js-jar.jar)时,根文件夹总是命名为artifactid-version(spring-js-resources-thin-2.2) .1.RELEASE),然后是META-INF.
我想知道无论如何我都可以使用文件名构建jar文件artifactid-version.jar,但是artifactid-version在类路径中没有,就像maven存储库中的每个jar一样.我认为应该有一个选项或方法来命名<outputDirectory>.