Maven构建不导出包装类型jar的依赖库

时间:2018-11-21 08:14:24

标签: java maven

我需要创建一个将在批处理模式下运行的可运行jar文件。 在开发过程中,我需要使用以下api / frameworks apache-poi,hibernate,Spring等。

所以,我更喜欢Maven:

请在我的Maven文件下面找到:

<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>mypackage</groupId>
    <artifactId>myartifact</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <properties>
       <java.version>1.8</java.version>
    </properties>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.17.Final</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>5.0.6.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-orm</artifactId>
         <version>5.0.6.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jms</artifactId>
         <version>5.0.6.RELEASE</version>
     </dependency>
     <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.17</version>
      </dependency>
      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-lang3</artifactId>
         <version>3.8.1</version>
      </dependency>
     </dependencies>
    <build>
      <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-jar-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                       <mainClass>fully.qualified.classpath.Main</mainClass>
                       </manifest>
                       <manifestEntries>
                         <Class-Path>.</Class-Path>
                      </manifestEntries>
                   </archive>
              </configuration>
           </plugin>
       </plugins>
   </build>
 </project>

我正在以clean package的身份从Eclipse运行Maven构建。 构建成功完成,但是在生成的jar中所有依赖的jar 不存在[春天/休眠/ poi]等。

我们需要在命令提示符/控制台中以java -jar jarname的形式运行此jar。

3 个答案:

答案 0 :(得分:2)

请考虑使用Maven Shade Plugin

  

此插件提供了将工件打包在uber-jar中的功能,包括其依赖项

Spring框架可以为您做类似的事情。 Generate sample project并检查其pom文件。

答案 1 :(得分:0)

maven-jar-plugin提供了无需依赖即可构建jar的功能。 要创建具有所有依赖项的jar,可以使用maven-assembly-pluginmaven-shade-plugin。以下是maven-assembly-plugin中的pom.xml配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>
                            fully.qualified.classpath.Main
                        </mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

更多信息:executable-jar-with-maven

答案 2 :(得分:0)

在pom.xml文件中尝试以下操作:

<build>
<plugins>
    <plugin> 
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.8</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                    <includeScope>runtime</includeScope>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>