我刚刚尝试了Shade插件,但生成的jar总是被压缩.
如何关闭jar压缩?
这是pom:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<compress>false</compress>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
谢谢
法布里斯
我很抱歉提前我无法提供确切的代码,因为我现在还没有它.但是,在尝试将项目打包到jar中时遇到了问题.我在我的pom.xml中使用maven assembly插件将所有依赖项和项目jar组装到一个地方.但是现在我需要所有这些依赖jar都有一个自定义清单文件.有可能以某种方式向Maven本身注入一些属性吗?现在我提出的唯一解决方案是使用Maven的shade插件并创建一个超级jar,但问题是一些依赖项具有自定义清单(如Spring框架),它们会丢失并且只为uber生成一个清单-罐.有可能以某种方式告诉maven解包依赖关系,编辑manifestEntries并再次打包它们并与zip中的项目jar一起组装吗?
长话短说:基本上我想知道的是,是否可能以某种方式修改其中一个依赖jar或所有依赖jar中的文件?假设我的项目依赖于spring-beans.现在我想在spring-beans.jar中修改一个特定的文件,特别是manifest.md,然后我将它们组装在一个zip中,该zip应包含project.jar和spring-beans.jar(带有修改后的manifest.md).我认为使用maven antrunner插件可以实现类似的功能吗?
例:
<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>com.mycompany.app</groupId>
<artifactId>project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Project</name>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
我想在spring-core.jar,spring-context.jar和spring-beans.jar中修改manifest.md.我知道我可以使用shade插件制作一个超级jar,它有一个manifest.md,我可以在shade的配置中编辑,但是如果有可能以某种方式修改特定的依赖jar,我认为它会更加简单,我可以在几个小程序中使用这些库.
我的项目中有以下情况:
一个具有自己的依赖关系的大模块(称为转换器)正被集成到主应用程序中(由不同的人分别开发并具有自己的,部分重叠的依赖关系);
最初这个转换器模块可以从命令行调用为可执行jar,因此它有自己的入口点(定义了main()方法的runnable类); 这个可执行的jar总是通过maven shade插件创建为超级jar;
现在这个转换器模块必须可以从主应用程序中另外调用(为此,我现在在形成命令行参数后直接调用入口点类的main()).主应用程序也被创建为超级jar,并计划继续以这种方式创建.
在这种情况下,我将使用shade插件实现依赖关系的正确分离,为此,我已将以下重定位规范添加到转换器模块的pom.xml中:
<relocations>
<relocation>
<pattern>com</pattern>
<shadedPattern>quase.com</shadedPattern>
</relocation>
<!-- ... other top-level patterns for converter dependencies -->
<relocation>
<pattern>org</pattern>
<shadedPattern>quase.org</shadedPattern>
<excludes>
<exclude>org.aau.**</exclude> <!-- my own code for converter is not shaded -->
</excludes>
</relocation>
</relocations>
Run Code Online (Sandbox Code Playgroud)
因此,转换器模块的所有依赖关系都被加上阴影(对它们进行预先设定),同时组合到主应用程序的超级jar中.
此配置的问题是应用程序和转换器都使用日志记录(slf4j和log4j),并且从应用程序代码调用转换器方法并开始使用日志记录后,会发生以下错误:
log4j:ERROR A "org.apache.log4j.FileAppender" object is not assignable to a "quase.org.apache.log4j.Appender" variable.
log4j:ERROR The class "quase.org.apache.log4j.Appender" was loaded by
log4j:ERROR [sun.misc.Launcher$AppClassLoader@55f96302] whereas object of type
log4j:ERROR "org.apache.log4j.FileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@55f96302].
log4j:ERROR Could not instantiate appender named "file1".
log4j:ERROR A …Run Code Online (Sandbox Code Playgroud) 对我来说很简单:我正在使用2个非常流行但有冲突的scala库:Spark SQL和JSON4s.每个都取决于Jackson XML解析器的不同版本.
因为除了我自己的程序没有人使用JSON4s,一个简单的解决方案是迁移软件包org.json4s.jackson,并com.fasterxml.jackson到新的位置.
但是,maven-shade插件只能在打包过程中执行此操作,因为所有测试和IDE运行都在此之前发生.无论是在IDE中的mvn-test还是scala测试中运行,这仍然会导致所有测试失败.
是否有一个插件可以集中管理所有三种情况的包重定位策略:JAR-packaging/mvn-test/IDE-run?我整天都在网上搜索,找不到答案.
我正在使用openrdf的项目,我需要使用shade插件来转换我的服务条目.我想同时建立一个战争和一个罐子,因为两种用法都是可能的.但是,我无法获得阴影插件同时生成阴影jar和阴影战争 - 阴影仅调用属性中定义的包类型,并绑定例如jar插件到包阶段以创建jar在战争旁边导致一个没有阴影的罐子.如何同时创建阴影罐和阴影战争?
maven-shade-plugin:2.4.3在标准的maven项目中有一个非常奇怪的构建.mainClass执行maven package命令时总是抛出找不到异常.我只是模拟一个maven-shade-plugin示例,见下文:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.core.utils</groupId>
<artifactId>dateUtils</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>dateUtils</name>
<url>http://maven.apache.org</url>
<properties>
<jdk.version>1.7</jdk.version>
<jodatime.version>2.5</jodatime.version>
<junit.version>4.11</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${jodatime.version}</version>
</dependency>
</dependencies>
<build>
<finalName>dateutils</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<!-- download source code in Eclipse, best practice -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</plugin>
<!-- Set a compiler level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<!-- Maven Shade Plugin …Run Code Online (Sandbox Code Playgroud) 我正在使用 Maven 来构建一个特定的项目,并且在 POM 中,我正在使用 maven shade 插件构建主要工件的 3 个不同变体(我正在创建具有各种包含日志框架组合的 uber jar)。阴影插件使用替代工件 ID 及其各自的依赖减少的 poms 创建 jar。
我现在面临的挑战是如何将这些新工件部署到我的远程存储库。我正在使用 maven install 插件将它们安装到我的本地 repo,但是 maven deploy 插件需要显式配置存储库 URL。我想要发生的是插件采用默认部署使用的任何远程存储库,无论是快照或发布存储库还是我通过命令行传入的另一个存储库 URL。我希望找到一些像 ${project.remoterepo.url} 这样的 maven 属性,它等同于已解决的 repo。当部署目标已经这样做时,必须显式配置远程 URL 似乎很愚蠢。
任何建议表示赞赏。谢谢!
我想在我的可执行jar.so中捆绑JRE,这个exe可以在任何系统中运行.我已经尝试过lunch4j来创建捆绑的JRE,但我们需要运送JRE和exe两者.但根据我的要求,我不应该使用任何安装程序.我不应该在客户端机器中提取jre.请帮助有一种方法将JRE放入jar并使其使用.
我在项目中使用ASM 6.1动态生成Class文件。但是组装一个胖罐子时我遇到了一个问题。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.4.3:shade (default-cli) on project uetlx: Error creating shaded jar: null: IllegalArgumentException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.4.3:shade (default-cli) on project uetlx: Error creating shaded jar: null
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused …Run Code Online (Sandbox Code Playgroud) 我有以下项目结构。
没有 src/main 文件夹。
以上 src/test/java 文件夹包含一些 scala 类以及一些 java 类。当我使用以下插件构建 jar 文件时
请建议
如何生成解压所有依赖项的“测试”jar。或者在这种情况下如何使用 src/test/java 文件夹下的所有类以及测试类所需的所有依赖项生成 jar 文件
java executable-jar maven-jar-plugin maven-shade-plugin karate
maven ×8
java ×6
jar ×3
bundle ×1
compression ×1
dependencies ×1
exe ×1
karate ×1
log4j ×1
manifest ×1
packaging ×1
relocation ×1