如何:Eclipse Maven 安装带有依赖项的构建 jar
我在 Eclipse 中使用 Eclipse Maven (m2e),我正在像这样运行我的项目:
I am using Eclipse Maven (m2e) inside Eclipse and I am running my project like this:
我的 pom.xml
看起来像这样:
My pom.xml
looks like this:
<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>ro.project</groupId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>ro.project</name>
<properties>
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>
<org.hibernate.version>4.1.0.Final</org.hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ro.project.ProjectServer</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.7.0_02</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
<executions>
<execution>
<id>ant-magic</id>
<phase>prepare-package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<property name="compile_classpath" refid="maven.compile.classpath" />
<property name="runtime_classpath" refid="maven.runtime.classpath" />
<property name="test_classpath" refid="maven.test.classpath" />
<property name="plugin_classpath" refid="maven.plugin.classpath" />
<ant antfile="${basedir}/clientExport.xml" target="export-all" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<artifactId>project-core</artifactId>
<url>http://www.project.ro</url>
</project>
在我运行 maven 安装后,它正在工作......
After I run the maven install it is working...
Maven 运行配置:
Maven run configurations:
问题是我生成的 .jar
它没有包含依赖项......如何配置 pom.xml
以包含我的所有依赖项 .jar
格式而不是解包..因为似乎解包不正确...
The problem is that my generated .jar
it doesn't have the dependencies included....
How can I configure pom.xml
to include all my dependencies in .jar
format and not unpacked.. because it seems that unpacked are not working correct...
为了确保包含所有 jars 没问题.我下载了每个库并将其添加到 jar
的 /lib
文件夹中,并且 jar 正在运行...所以.. 我唯一的问题是:如何配置 pom.xml
以便以 jar
格式添加我的所有依赖项?
To be sure that including all jars is ok.. I downloaded and added each library into jar
's /lib
folder and the jar is running... so.. my only question is: How can I configure pom.xml
in order to add all my dependencies in jar
format?
我尝试了所有方法:
组装:组装
组装:单个
assembly:single
与我的描述符(一个assemble.xml
文件),但它不工作maven 复制依赖项
插件,但仍无法与 Eclipse Maven 一起使用 -m2e
assembly:assembly
assembly:single
assembly:single
with my descriptor (anassemble.xml
file) but it wasn't workingmaven copy dependencies
plugin but still not working with Eclipse Maven -m2e
我没有解决方案...谁能告诉我在 jar 中添加依赖项的正确方法?我不敢相信 maven
如此复杂,而且我到处都找不到我的问题的答案..
I am out of solutions... can anyone tell me a proper way to add my dependencies in jar? I can't believe that maven
is so complex and I can't find an answer to my question everywhere..
提前谢谢你
推荐答案
有几种方法可以做到这一点.
There are a couple of ways of doing this.
1) 如果您想要一个 uber-jar(重新打包所有依赖项),请考虑使用和配置 maven-shade-plugin:
1) If you want an uber-jar (repacked with all dependencies), look into using and configuring the maven-shade-plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.group.id.Launcher1</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这将解压缩所有依赖项并将它们合并到一个 JAR 文件中.
This will unpack all dependencies and merge them into one JAR file.
2) 如果你想提供一个包(zip、tar.gz 等)以及包中的解压 JAR 文件(可能在 lib/下),那么你需要查看 maven-assembly-plugin:
2) If you want to deliver a bundle (zip, tar.gz, etc) with the unpacked JAR files in the bundle (perhaps under lib/) then you need to look into the maven-assembly-plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>create-distro</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/dist.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
请注意,这需要一个程序集描述符 src/main/assembly/dist.xml
,示例如下所示:
Note that this requires an assembly descriptor src/main/assembly/dist.xml
and example looks like this:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0">
<id>distribution</id>
<formats>
<format>zip</format>
</formats>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>false</useTransitiveDependencies>
<unpack>false</unpack>
<scope>runtime</scope>
<fileMode>0755</fileMode>
<directoryMode>0755</directoryMode>
<outputDirectory>bin</outputDirectory>
<includes>
<include>com.group.id:project-launch1</include>
<include>com.group.id:project-launch2</include>
</includes>
</dependencySet>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>true</useTransitiveDependencies>
<unpack>false</unpack>
<scope>runtime</scope>
<fileMode>0644</fileMode>
<directoryMode>0755</directoryMode>
<outputDirectory>lib</outputDirectory>
<includes>
<include>com.group.id:project-lib1</include>
<include>com.group.id:project-lib2</include>
<include>com.group.id:project-lib3</include>
<include>com.group.id:project-lib4</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>
既然你现在正在组装依赖,你最好在 pom.xml 中定义依赖,像这样:
And since you are now assembling dependencies, you have better define the dependency in the pom.xml, like so:
<dependencies>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-launch1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-launch2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-lib1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
... and so on ...
</dependencies>
3) 如果您要交付带有可执行 JAR 文件启动器的捆绑包,您可能需要添加 maven-jar-plugin 配置除了 maven-assembly-plugin:
3) If you are delivering a bundle with an executable JAR file launcher, you will likely need to add a maven-jar-plugin configuration in addition to the maven-assembly-plugin:
<dependencies>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-lib1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-lib2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.group.id</groupId>
<artifactId>project-lib3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
... and so on ...
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<compress>true</compress>
<manifest>
<mainClass>com.group.id.Launcher1</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>../lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
请注意,addClasspath"指令将项目依赖项添加到类路径中.这是 JAR 启动器所必需的,因为它们明确忽略所有 CLASSPATH 环境变量.
Note that the "addClasspath" directive adds the project dependencies to the class path. This is needed for JAR launchers, as they explicitly ignore all CLASSPATH environmental variables.
相关文章