我使用了Apache Maven Shade Plugin来创建胖jar(包含所有依赖项的所有类的jar).我当前的项目文件夹结构看起来像这样,
> Parent Module (packaging pom)
> Module 1 (packaging jar)
> Own classes
> Dependency-1
> Dependency-2
> Module 2 (packaging jar)
> Own classes
> Module 1 (I want here only classes written in module-1, not any transitive dependencies)
> Dependency-1
> Dependency-2
> Dependency-3
Run Code Online (Sandbox Code Playgroud)
pom.xml来自父模块的快照,
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>common-shade</id>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
pom.xml …
dependency-management maven-plugin maven transitive-dependency maven-shade-plugin
我最近了解到gradle 有api/ implementation“范围” 的依赖关系,我试图弄清楚是否有一个implementation与 gradle 中的 Maven 等效的东西。没有一个 Maven 依赖范围看起来完全适合这个 -provided使它不是运行时依赖,compile/runtime似乎没有做正确的事情,......所以似乎没有直接的等价物。
基本上,我有一个在编译时(对于我的库)/运行时(对于使用我的库的代码)所需的库的依赖项,但我不想在依赖于我的代码的编译类路径中图书馆。这可以用maven来做吗?
我有以下场景:
mylib是一个库(我有源代码,所以我想把它们放到maven项目mylib:mylib中).这个库有一个jar依赖项,我只有jar,而且它不能在Maven存储库中找到(我也不想在那里安装它).为了使它编译,这样的东西可以工作:将jar文件添加到"lib"文件夹中的mylib项目,例如"lib/thirdpartylib.jar"和mylib的pom.xml中,添加一个自选组的依赖项/工件/版本和" <scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>"条目.mylib项目将编译正常.
请注意,mylib还具有对dll文件的运行时依赖性,例如thirdparty.dll.但是对于编译来说这并不重要.
但是,现在我想知道如何实现以下目标:
任何其他项目,例如项目"X",使用 mylib,将需要
- mylib.jar
- thirdpartylib.jar
- thirdpartylib.dll
Run Code Online (Sandbox Code Playgroud)
,
并且它必须将java.library.path设置为目录(例如"."),以便执行VM找到第三方jar和dll.
我关心的是:我希望第三方jar/dll是mylib项目的责任.即我想定义知识,你需要将第三方jar和dll复制到目标文件夹,java.library.path引用它们,成为mylib项目的一部分(mylib pom知道事情是怎样的用于其他项目).然而,我希望这些知识(即复制指令,无论它们是如何在Maven中完成)以传递方式移交给使用mylib的任何其他项目,例如X. 这有可能吗?
[我现在的黑客解决方案是我在X中有第三方的副本,但即便如此我也不知道如何复制/处理dll文件,所以我必须写一个自述文件说dll文件有被复制到执行VM的bin文件夹中).
任何建议表示赞赏!
假设我有一个动态库a.so.
然后,我建立b.so针对a.so只有当a.so存在于机器上.
然后,我建立可执行的c反对b.so.
我希望能忘掉一切a.so的c Makefile,但现在看来,我需要补充a的-L标志或者我不确定引用a.so时符号c链接.
这是正常的动态链接还是我忘记了什么?
c++ dynamic shared-libraries dynamic-linking transitive-dependency
在一个单独的项目中遇到此问题后,我进行了一个测试项目以验证该问题。
app。libraryone。libraryone,我向Gson添加了一个依赖项,并使用Gson使用单个静态方法添加了一个类。app,我向添加了一个依赖项libraryone。我和一起进行了简单的测试transitive = true,因为互联网似乎模糊地同意这样做可能会有所帮助。(它没有。)app,在MainActivity,我使用的班级libraryone。这行得通(只要我没有transitive = false设置)。MainActivity自身引用Gson 。无论是从Android Studio还是从命令行Gradle中,它都会给出“无法解析符号'Gson'”错误。这是不寻常的,而且令人不快,因为这意味着您必须在整个项目组中重复通用的依赖关系,并且这些类仍会包含在输出中。当然是我做错了什么,还是这是个错误?我的代码如下:
MainActivity.java(在中app)
package com.erhannis.test.dependencytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.erhannis.test.libraryone.LibClass;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s = LibClass.convert(new Object());
System.out.println("out: " + s);
new com.google.gson.Gson(); // This line gives a compile-time …Run Code Online (Sandbox Code Playgroud) dependencies android transitive-dependency android-gradle-plugin
我与传递依赖有冲突。推翻、排除或强迫都无济于事。我还能做什么才能将正确版本的库放入 jar 中?完整的代码是。找到了https://github.com/geoHeil/gradle-dependency-resolution,但其主要部分如下所述。
执行
./gradlew shadowJar
Run Code Online (Sandbox Code Playgroud)
禁用 geomesa 依赖项(引入过时版本的 typesafe/lightbend 配置库):
dependencies {
compile "com.github.kxbmap:configs_2.11:0.4.4"
//compile "org.locationtech.geomesa:geomesa-hbase-spark-runtime_2.11:2.0.1"
}
Run Code Online (Sandbox Code Playgroud)
并执行 jar
java -jar build/libs/gradleThing-all.jar
Run Code Online (Sandbox Code Playgroud)
输出
hello
my config is: Success(Job1Configuration(frequencyCounting))
Run Code Online (Sandbox Code Playgroud)
启用依赖项时:
./gradlew shadowJar
java -jar build/libs/gradleThing-all.jar
Run Code Online (Sandbox Code Playgroud)
它失败了
hello
Exception in thread "main" java.lang.Exception: Failed to start. There is a problem with the configuration: Vector([extract] com.typesafe.config.Config.hasPathOrNull(Ljava/lang/String;)Z)
Run Code Online (Sandbox Code Playgroud)
这与配置库的过时版本有关,如何解决类型安全配置上的NoSuchMethodError?。还通过以下方式确认:
gradle dependencyInsight --dependency om.typesafe:config
> Task :dependencyInsight
com.typesafe:config:1.3.1 (conflict resolution)
variant "runtime" [
Requested attributes not found in the selected …Run Code Online (Sandbox Code Playgroud) 我想知道 Gradle 传递依赖中的“all*.exclude”是什么意思?
configurations {
compile.exclude group: 'org.hamcrest', module: 'hamcrest-core'
all*.exclude group: 'org.mockito', module: 'mockito-all'
}
Run Code Online (Sandbox Code Playgroud)
上面代码中的“all*.exclude”是 Gradle 或其他语法中的。
我运行npm audit并收到一条消息assign-deep有漏洞,但已在 1.0.1 中修复
不幸的是,这是一个传递依赖。有没有办法更新此传递依赖项,使其使用 v1.0.1 ?
\n\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac update@0.7.4\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac assemble-core@0.25.0\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac templates@0.24.3\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac engine-base@0.1.3\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\xac engine@0.1.12\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 assign-deep@0.4.8 \nRun Code Online (Sandbox Code Playgroud)\n 我试图确保我从maven发布的测试jar具有正确的传递依赖关系。
例如,test-jar不会依赖非test-jar生成。
类似地,例如AAA发布了一个测试罐,而BBB包含了AAA的测试罐的测试作用域依赖性。在CCC的测试中,当我使用BBB的test-jar中的类,而使用AAA的test-jar中的类时,我在AAA的test-jar中的类上收到“找不到类”错误-即,BBB的测试的传递依赖项aren根本没有正确记录。
有什么办法可以依靠BBB的测试罐正确地引入传递依赖关系吗?
我在https://github.com/nkronenfeld/transitive-test-dependencies中有所有这些的示例代码
对于BBB的常规jar和AAA的test jar,在CCC / pom.xml中有两个已注释掉的依赖项,似乎都不需要它们。但是,CCC的测试目标不会没有任何一个。
unit-testing dependency-management maven transitive-dependency
从版本 3.0.0 开始,Android Gradle 插件允许您将模块的依赖项导出到其他模块。
因此,在我的 android 库模块中,我应该能够使用该依赖项来声明api <dependency declaration>依赖项,并将该依赖项作为导出的传递依赖项访问,在我的主应用程序项目中,我已将我的库模块声明为依赖项。
我还使用静态文件依赖项。
举个例子:
我有一个类NeededEverywhere,它是在它自己的 gradle 模块中定义的everywhere-module。该模块与我的库模块位于同一项目中。
//library module's build.gradle:
dependencies {
api project(':everywhere-module')
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的 build.gradle(位于不同的 Android Studio 项目中)中,我声明了对库的依赖,但不是everywhere-module. 这应该意味着这everywhere-module是一个导出的传递依赖。
//app project's build.gradle
dependencies {
implementation files("path/to/my/library/file.aar")
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法访问NeededEverywhere我的应用程序中的课程。
我究竟做错了什么?
android gradle transitive-dependency android-studio gradle-dependencies
gradle ×4
maven ×4
android ×2
dependencies ×2
c++ ×1
copy ×1
dll ×1
dynamic ×1
maven-plugin ×1
npm ×1
npm-audit ×1
unit-testing ×1