在实验/快速和肮脏的模拟开发阶段,Maven2让我发疯.
我有一个pom.xml文件定义了我想要使用的web-app框架的依赖项,我可以从该文件快速生成启动项目.但是,有时我想链接到尚未pom.xml定义文件的第三方库,所以不是pom.xml手动创建第三方库的文件并安装它,并将依赖项添加到我的pom.xml,我只是想告诉Maven:"除了我定义的依赖项,还要包含任何罐子/lib."
看起来这应该很简单,但如果是这样,我就会遗漏一些东西.
任何关于如何做到这一点的指针都非常感谢.除此之外,如果有一种简单的方法将maven指向一个/lib目录并轻松创建一个pom.xml所有封闭的jar映射到单个依赖项,然后我可以一次命名/安装和链接就足够了.
所以我试图将我的本地.jar文件依赖项添加到我的build.gradle文件中:
apply plugin: 'java'
sourceSets {
main {
java {
srcDir 'src/model'
}
}
}
dependencies {
runtime files('libs/mnist-tools.jar', 'libs/gson-2.2.4.jar')
runtime fileTree(dir: 'libs', include: '*.jar')
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我在这里将.jar文件添加到referencedLibraries文件夹中:https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1/referencedLibraries
但问题是当我运行命令时:在命令行上运行gradle我得到以下错误:
error: package com.google.gson does not exist
import com.google.gson.Gson;
Run Code Online (Sandbox Code Playgroud)
这是我的整个回购:https://github.com/WalnutiQ/wAlnut/tree/version-2.3.1
java dependency-management gradle gradle-eclipse build.gradle
我想用leiningen来构建和开发我的clojure项目.有没有办法修改project.clj告诉它从本地目录中挑选一些罐子?
我有一些专有的罐子无法上传到公共回购.
另外,leiningen可以用来维护clojure项目的"lib"目录吗?如果我的一堆clojure项目共享相同的jar,我不想为每个jar维护一个单独的副本.
谢谢
我的Android项目中有一个JAR,我想将它添加到最终的APK中.好的,我走了:
<dependency>
<groupId>com.loopj.android.http</groupId>
<artifactId>android-async-http</artifactId>
<version>1.3.2</version>
<type>jar</type>
<scope>system</scope>
<systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时,mvn package我收到警告:
[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25
Run Code Online (Sandbox Code Playgroud)
在最终的APK中没有JAR.
我该如何解决这个问题?
我正在使用Maven中描述的本地存储库:通过相对路径向jar添加依赖项.
repository-url在最顶层定义pom.xml为
<url>file:${basedir}/../3rdParty/maven-repository</url>
Run Code Online (Sandbox Code Playgroud)
此外,最顶层pom.xml定义了2个模块
<modules>
<module>sub1</module>
<module>sub2</module>
</modules>
Run Code Online (Sandbox Code Playgroud)
问题是,如果一个模块(比如说sub1)定义了一个应该从存储库下载的依赖项,并且maven是从最顶层的目录调用的,那么${basedir}它不会设置到这个目录,而是设置为sub1,导致错误的存储库URL.
所以,说最顶层的项目就pom.xml在
/Development/myproject/pom.xml
Run Code Online (Sandbox Code Playgroud)
存储库在
/Development/3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
然后应将存储库URL设置为
/Development/myproject/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
但事实证明它被设定为
/Development/myproject/sub1/../3rdParty/maven-repository
Run Code Online (Sandbox Code Playgroud)
这当然不存在.
知道为什么会这样吗?
我已经在Stack Overflow上找到了如何在项目中包含第三方JAR而不将其安装到"本地存储库"的答案:
我可以在没有安装的情况下将jar添加到maven 2 build classpath吗?
但是,当我使用Maven Shade插件创建包含项目所有依赖项的JAR时,第三方JAR不会自动包含在内.
如何让Maven Shade插件将这样的第三方JAR添加到着色的JAR中?
根据得到的答案,我做到了.我做的是,将这个片段添加到我的pom.xml的开头:
<repositories>
<repository>
<id>repo</id>
<url>file://${basedir}/repo</url>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
然后为我的项目添加了一个依赖项,也添加到pom.xml:
<dependencies>
<dependency>
<groupId>dummy</groupId>
<artifactId>dummy</artifactId>
<version>0.0.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
然后运行命令行将包添加到'repo':
mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file
-Dfile=<my-jar>.jar -DgroupId=dummy -DartifactId=dummy
-Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/
Run Code Online (Sandbox Code Playgroud)
(不确定repo路径是否需要完整路径,但不想冒险.)
repo子目录的内容现在是:
repo/dummy/dummy/0.0.0/dummy-0.0.0.jar
repo/dummy/dummy/0.0.0/dummy-0.0.0.pom
repo/dummy/dummy/maven-metadata-local.xml
Run Code Online (Sandbox Code Playgroud)
现在我可以将其检入版本控制,并且没有本地或远程依赖项.
这是我的pom文件:
<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.sia.g7</groupId>
<artifactId>sia</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>sia</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>commons-math</groupId>
<artifactId>commons-math</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jmathplot</groupId>
<artifactId>jmathplot</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/jmathplot.jar</systemPath>
</dependency>
<dependency>
<groupId>jgraphx</groupId>
<artifactId>jgraphx</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/jgraphx.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>com.sia.g7.AbstractSimulation</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
当我运行罐子时,我得到:
Exception in thread "main" java.lang.NoClassDefFoundError: com/mxgraph/swing/mxGraphComponent …Run Code Online (Sandbox Code Playgroud) 我正在尝试将jar文件添加到项目中的Maven依赖项中.settings.xml配置为将存储库设置为公共存储库.但是那个回购中没有这个特殊的罐子.因为我在我的lib文件夹中有jar,我如何配置Maven依赖项来获取这个jar?
是否可以在pom中定义依赖关系,使其具有系统范围但指向多个jar?
我确信这是非常不正统的,但我只是想知道这是否可能.所以类似于:
<dependency>
<groupId>foo</groupId>
<artifactId>foo</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/foo/*.jar</systemPath>
</dependency>
Run Code Online (Sandbox Code Playgroud) 我需要一个本地存储库来为我的项目提供一个JAR文件,该文件不能通过Maven Central存储库获得.我mvn install:install-file …根据http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html使用-DlocalRepositoryPath来安装我的JAR ,用于指示我的Git存储库中的路径,并-DcreateChecksum用于创建校验和.
这将安装JAR,生成POM,并为所有文件生成校验和.但有趣的是,它还maven-metadata-local.xml在groupId目录中创建了一个文件.来自http://maven.apache.org/ref/3.2.5/maven-repository-metadata/我收集的local是它为本地存储库提供的ID.
但是在我的POM中(mvn install:install-file无法知道)我使用local-repo我的存储库的ID :
<repositories>
<repository>
<id>local-repo</id>
<url>file:///${project.basedir}/repo</url>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
当然我可以改变我的POM来简单地<id>local</id>用来匹配生成的文件,但我不喜欢做事而不理解为什么我这样做.所以也许有人可以告诉我:
maven-metadata-local.xml吗?它有用吗?local需要匹配我在POM中使用的存储库ID?mvn install:install-file有一个参数允许我指示用于本地存储库的ID(例如,生成maven-metadata-local-repo.xml,或者我必须在之后手动重命名该文件?