关于java:如何将本地jar文件添加到Maven项目?

How to add local jar files to a Maven project?

如何将本地JAR文件(还不是Maven存储库的一部分)直接添加到项目的库源中?


您可以直接添加本地依赖项(如build maven项目中所述,包含属性库),如下所示:

1
2
3
4
5
6
7
<dependency>
    <groupId>com.sample</groupId>
    sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

更新

在新版本中,此功能被标记为已弃用,但仍在工作,尚未删除(您只会在maven启动期间在日志中看到警告)。Maven Group就这个https://issues.apache.org/jira/browse/mng-6523提出了一个问题(您可以参与并描述为什么这个功能在某些情况下有用)。我希望这个功能仍然存在!

如果你问我,只要这个特性没有被删除,我就用它来依赖我的项目中一个不适合存储库的淘气jar文件。如果删除了这个功能,那么,这里有很多好的答案,我可以稍后选择!


将jar安装到本地maven存储库中,如下所示:

1
2
3
4
5
6
7
mvn install:install-file \
   -Dfile=<path-to-file> \
   -DgroupId=<group-id> \
   -DartifactId= \
   -Dversion=<version> \
   -Dpackaging=<packaging> \
   -DgeneratePom=true

其中每一个都指:

:要加载的文件的路径,例如→c:\kaptcha-2.3.jar

:该文件应注册的组,如→com.google.code

:文件的人工制品名称,如→kaptcha

:文件的版本,如→2.3

:文件的包装,如→jar

参考文献

  • Maven常见问题解答:我有一个jar,我想放在本地存储库中。我怎样才能把它复制进去?
  • maven安装插件用法:install:install-file目标


首先,我想把这个答案归功于一个匿名堆栈溢出用户——我很肯定我以前在这里看到过类似的答案——但现在我找不到了。

将本地JAR文件作为依赖项的最佳选择是创建本地Maven存储库。这样的存储库只不过是一个包含pom文件的适当目录结构。

以我为例:我有一个关于${master_project}位置的主项目,子项目1在${master_project}/${subproject1}位置。

然后我在以下位置创建了一个Maven存储库:${master_project}/local-maven-repo

在位于${master_project}/${subproject1}/pom.xml的子项目1中的pom文件中,需要指定将文件路径作为url参数的存储库:

1
2
3
4
5
6
<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.parent.basedir}/local-maven-repo</url>
    </repository>
</repositories>

可以为任何其他存储库指定依赖项。这使您的POM存储库独立。例如,一旦Maven Central中提供了所需的JAR,您只需从本地回购中删除它,它就会从默认回购中提取出来。

1
2
3
4
5
    <dependency>
        <groupId>org.apache.felix</groupId>
        org.apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

最后但不是最不重要的事情是使用-dlocalrepositorypath开关将JAR文件添加到本地存储库,如下所示:

1
2
3
4
5
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

一旦安装了JAR文件,您的maven repo就可以提交到代码存储库,并且整个设置是独立于系统的。(Github中的工作示例)。

我同意让jar致力于源代码回购并不是一个好的实践,但在现实生活中,快速而肮脏的解决方案有时比全面的nexus回购更好,它可以承载一个jar,而您不能发布它。


在Maven项目的根目录下创建一个新的文件夹,比如local-maven-repo

只需在您的pom.xml中添加一个本地回购:

1
2
3
4
5
6
<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

然后,对于要安装的每个外部JAR,转到项目的根目录并执行:

1
mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]


1
2
3
4
5
6
7
<dependency>
    <groupId>group id name</groupId>
    artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>


我想要这样的解决方案-在POM文件中使用maven-install-plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>lib/yourJar.jar</file>
                        <groupId>com.somegroup.id</groupId>
                        artefact-id</artifactId>
                        <version>x.y.z</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>

在这种情况下,您可以执行mvn initialize,JAR将安装在本地maven repo中。现在,这个jar在这台机器上的任何maven步骤期间都可用(不要忘记将这个依赖项包括在带有标记的pom中的任何其他maven依赖项中)。也可以将jar安装绑定到initialize步骤,而不是您喜欢的任何其他步骤。


是的,你可以,但这不是个好主意。

相反,把所有这些罐子安装到maven repos

也看到

  • 如何建立包含专有图书馆的Maven项目

在pom文件中添加您自己的本地jar,并在maven build中使用它。

1
mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar

例如:

1
mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar

然后将其添加到POM中,如下所示:

enter image description here


一种方法是将其上载到您自己的Maven存储库管理器(如Nexus)。无论如何,拥有自己的存储库管理器是一个好的实践。

我最近看到的另一个好方法是在构建生命周期中包含maven安装插件:在pom中声明以将文件安装到本地存储库。这是一个有点,但很小的开销和没有涉及到手动步骤。

http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html


真正快速而肮脏的方法是指向本地文件:

1
2
3
4
5
6
7
<dependency>
      <groupId>sample</groupId>  
       com.sample</artifactId>  
       <version>1.0</version>
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

但是,这只会存在于您的机器上(很明显),因为共享它通常是有意义的,使用适当的M2存档(nexus/artifactory),或者如果您没有这些文件或不想设置一个本地Maven结构化存档并在POM中配置一个"存储库":当地的:

1
2
3
4
5
6
<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

远程:

1
2
3
4
5
6
<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

为此,也可以使用basedir变量来创建相对路径:

10


当然,您可以将jar添加到该文件夹中。但也许这不是你想要实现的…

如果需要这些jar进行编译,请检查相关问题:我可以不安装jar就将它们添加到maven 2 build类路径吗?

另外,在任何人提出建议之前,不要使用系统范围。


命令行:

1
2
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar

另一个有趣的例子是当你想在你的项目中有私人MavenJars。您可能希望保留Maven解决可传递依赖项的功能。解决方案相当简单。

  • 在项目中创建文件夹libs
  • 在pom.xml文件中添加以下行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
    </properties>

    <repositories>
       <repository>
            <id>local-maven-repository</id>
            <url>file://${local.repository.folder}</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
       </repository>
    </repositories>
  • 打开.m2/repository文件夹,并将要导入的项目的目录结构复制到libs文件夹中。

  • 例如,假设您要导入依赖项

    10

    只需继续.m2/存储库,您将看到以下文件夹

    com/mycompany/myproject/1.2.3公司

    复制libs文件夹中的所有内容(同样,包括.m2/repository下的文件夹),就完成了。


    首选的方法是创建自己的远程存储库。

    有关如何操作的详细信息,请参阅此处。查看"上载到远程存储库"部分。


    还可以看看……

    1
    <scope>compile</scope>

    Maven依赖项。这是默认值,但在某些情况下,我发现显式设置该范围也可以在本地存储库中找到本地库。


    我想分享一个代码,你可以上传一个装满jar的文件夹。当提供者没有公共存储库,并且您需要手动添加大量库时,这非常有用。我决定构建一个.bat,而不是直接调用Maven,因为它可能是内存不足错误。它是为Windows环境准备的,但很容易适应Linux操作系统:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    import java.util.jar.Attributes;
    import java.util.jar.JarFile;
    import java.util.jar.Manifest;

    public class CreateMavenRepoApp {

        private static final String OCB_PLUGIN_FOLDER ="C://your_folder_with_jars";

        public static void main(String[] args) throws IOException {

        File directory = new File();
        //get all the files from a directory
        PrintWriter writer = new PrintWriter("update_repo_maven.bat","UTF-8");
        writer.println("rem"+ new Date());  
        File[] fList = directory.listFiles();
        for (File file : fList){
            if (file.isFile()){              
            String absolutePath = file.getAbsolutePath() ;
            Manifest  m = new JarFile(absolutePath).getManifest();
            Attributes attributes = m.getMainAttributes();
            String symbolicName = attributes.getValue("Bundle-SymbolicName");

            if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
                String[] parts =symbolicName.split("\\.");
                String artifactId = parts[parts.length-1];
                String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
                String version = attributes.getValue("Bundle-Version");
                String mavenLine="call mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar";
                writer.println(mavenLine);          
            }

            }
        }
        writer.close();
        }

    }

    在从任何IDE运行完这个主文件之后,运行更新的repo maven.bat。


    这是较新版本的简短语法:

    1
    mvn install:install-file -Dfile=<path-to-file>

    当jar由ApacheMaven构建时,它就工作了——这是最常见的情况。然后它将在META-INF目录的子文件夹中包含pom.xml,默认情况下将读取该子文件夹。

    来源:http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


    请注意,使用本地回购并不一定是一个好主意。如果这个项目是与其他人共享的,那么当它不工作时,其他人都会有问题和疑问,即使在源代码控制系统中,JAR也不可用!

    尽管共享回购是最好的答案,但是如果您出于某种原因不能这样做,那么嵌入JAR比本地回购更好。仅本地回购内容会导致许多问题,特别是随着时间的推移。


    在本地存储库中,您可以通过发出命令来安装JAR。

    1
    2
     mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
    -DartifactId= -Dversion=<version> -Dpackaging=<packaging>

    在mkyoung的网站上,按照这个有用的链接做同样的事情。你也可以查看Maven指南


    出于某种原因,在我要维护的Web应用程序中,alireza fattahi的解决方案和jj roman的解决方案都不能正常工作。在这两种情况下,编译都是正常的(它看到了JAR),但是包装在战争中没有包含JAR。

    唯一能让它工作的方法是把罐子放在/src/main/webapp/WEB-INF/lib/上,然后把它和法塔希斯或罗马的解决方案结合起来。


    我认为解决这个问题的更好的方法是使用maven安装插件在安装时自动安装文件。这就是我为我的项目设置的方法。

    首先,添加路径(在其中存储local.jars)作为属性。

    1
    2
    3
    <properties>
        <local.sdk>/path/to/jar</local.sdk>
    </properties>

    然后,在plugins下添加一个插件,以便在编译时安装jar。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        maven-install-plugin</artifactId>
        <version>2.5.2</version>
        <executions>
            <execution>
                <id>1</id>
                <phase>initialize</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <groupId>com.local.jar</groupId>
                    appengine-api</artifactId>
                    <version>1.0</version>
                    <packaging>jar</packaging>
                    <file>${local.sdk}/lib/impl/appengine-api.jar</file>
                </configuration>
            </execution>
            <execution>
                <id>appengine-api-stubs</id>
                <phase>initialize</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <groupId>com.local.jar</groupId>
                    appengine-api-stubs</artifactId>
                    <version>1.0</version>
                    <packaging>jar</packaging>
                    <file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
                </configuration>
            </execution>
        </executions>
    </plugin>

    最后,在依赖项中,可以添加jar

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dependency>
        <groupId>com.local.jar</groupId>
        appengine-api</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>com.local.jar</groupId>
        appengine-api-stubs</artifactId>
        <version>1.0</version>
        <scope>test</scope>
    </dependency>

    通过这样设置您的项目,即使您将它带到另一台计算机上(假定它具有属性local.sdk指定的路径中的所有jar文件),该项目也将继续构建。

    对于groupId,使用唯一的名称以确保没有冲突。

    现在,当您使用mvn installmvn test时,将自动添加本地jar。


    在ApacheMaven 3.5.4中,我不得不添加双引号。如果没有双报价,我就没用。

    例子:mvn install:install file"-dfile=location to the jar file""-dgroupid=group id""-dartifactid=artifact id""-dversion=version""-dpacking=package type"


    要安装第三方JAR,请如下调用命令

    1
    mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path

    我在pom.xml中的一组依赖项也有同样的错误,结果发现这些依赖项的版本没有在pom.xml中指定,并且在父存储库中提到。出于某种原因,版本详细信息没有与此回购同步。因此,我使用标签手动输入了版本,它工作得很有魅力。在父级中查找版本并在此处指定需要一点时间。但这可以只针对显示工件ID错误的JAR,并且它可以工作。希望这能帮助别人。


  • mvn install
  • 您可以在命令行中编写下面的代码,或者如果您使用的是EclipseBuiltinMaven,右键单击project->run-as->run-configurations…->在左侧面板中,右键单击maven build->new configuration->write the code in goals&in base directory:$project loc:name of yourproject->run

    1
    2
    3
    4
    5
    6
    7
    mvn install:install-file
       -Dfile=<path-to-file>
       -DgroupId=<group-id>
       -DartifactId=
       -Dversion=<version>
       -Dpackaging=<packaging>
       -DgeneratePom=true

    其中每一个都指:

    :要加载的文件的路径,例如->c:kaptcha-2.3.jar

    :文件应该注册在的组,例如->com.google.code。

    :文件的artifact名称,例如->kaptcha

    :文件的版本,例如->2.3

    :文件的打包,例如->jar

    2.After installed, just declares jar in pom.xml.

    1
    2
    3
    4
    5
     <dependency>
          <groupId>com.google.code</groupId>
          kaptcha</artifactId>
          <version>2.3</version>
     </dependency>

    此答案仅适用于Eclipse用户:

    如果您使用Eclipse,请将jar放在lib/中,右键单击jar名称,然后单击"添加到构建路径"。Eclipse将创建一个"引用库",并为您放置JAR。

    它立刻为我解决了程序中jar的导入问题。


    我对OJDC6也有同样的问题。我看到了这个链接,但没用。命令是正确的,但我还需要一个参数,

    链接如下:http://roufid.com/3-ways-to-add-local-jar-to-maven-project/

    示例如下:

    1
    install:install-file -Dfile=C:\driversDB\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar