标签: classpath

bash 脚本应该如何确定 Maven 项目及其依赖项的类路径?

耶,我的论文完成了!现在压力已经消失,我已经玩够了 Skyrim,我正在将我为论文编写的代码从使用 ant 构建的混乱目录转换为一个漂亮的 Maven 项目。

我最初有一个bin包含大约 20 个 bash 脚本的目录,这些脚本运行我论文中使用的各种 java 和 ruby​​ 程序,包括最终的基于 jruby/sinatra 的 Web 服务器。我计划将我的脚本移至src/main/scripts,但我需要弄清楚如何处理类路径。

我之前只是将脚本中的路径硬编码到手动下载的依赖项。但是,既然 Maven 正在下载并存储我需要的所有 jar,那么从我的脚本中引用它们的最佳方法是什么:

  • 我是否应该像以前一样让脚本引用本地存储库中各种 jar 的完整路径?
  • 我应该将本地存储库目录作为我的脚本的配置选项并使用该目录的相对路径吗?
  • 我应该使用Maven 程序集插件构建一个包含所有依赖项的大罐子,并通过脚本相对路径访问它吗../../../target/*-jar-with-dependencies.jar?
  • 还有我没有想到的更好的选择吗?

bash classpath maven

5
推荐指数
1
解决办法
1746
查看次数

jar 和类路径通配符

我想为 Win 7 下的独立 java 应用程序指定多个类路径目录,java 7 都是 64 位。

目录结构应该如下

-app
|-lib
|-dynamicLib
|app.jar
Run Code Online (Sandbox Code Playgroud)

lib 文件夹包含在清单中直接引用的依赖项。中的所有内容dynamicLib也应该被加载。

我尝试了以下方法:

添加dynamicLib\*到清单类路径

像这样添加dynamicLib到命令行

java -cp "dynamicLib\*";app.jar my.mainclass 
Run Code Online (Sandbox Code Playgroud)

后者带引号和不带引号、绝对路径和相对路径、反斜杠等。但这两种方法都不起作用。

那么,在执行 jar 时如何将通配符目录添加到现有的类路径中呢?

java directory jar wildcard classpath

5
推荐指数
1
解决办法
6584
查看次数

Gradle 更改资源文件在 JAR 中的目标位置

我正在 Gradle-fing 一个具有以下结构的遗留项目:

root
+--- common
|    \--- config
+--- module1
\--- module2
Run Code Online (Sandbox Code Playgroud)

在原始项目中,config它只是一个文件夹,其中包含针对不同环境组织在子文件夹中的配置文件。它包含一个顶级文件夹props和许多子文件夹,如下所示:

config
\--- props
     +--- prod
     +--- dev
     +--- john
     \--- mike
Run Code Online (Sandbox Code Playgroud)

该项目可以配置为使用任何子文件夹。配置通过如下所示的方法加载:

Config.class.getClassLoader().getResourceAsStream("props/" + ENV + "/" + name);
Run Code Online (Sandbox Code Playgroud)

其中ENV定义环境(它是系统属性),即它可以是prod、dev、mike等,并且name只是要加载的文件的名称。

运行测试时,我需要props在类路径中包含该文件夹。在构建生产工件(JAR 和 WAR)时,我不想避免这种情况,并且仅手动复制我需要的文件,以避免可能的冲突或事故。

所以我决定制作config自己的 Gradle 项目,并将其作为 testCompile 依赖项添加到其他需要配置的模块中。但是,如果我将该props文件夹添加为 Gradle 中的资源文件夹,则该config模块的生成 JAR 文件将展平该文件夹的所有子文件夹props(这是预期的行为),因此上面的代码将会失败。

我的问题是:有没有办法告诉 Gradle 将这些文件复制到名为 props 的子文件夹中,而不是复制到 JAR 的根目录中?

我知道重构项目并移动文件夹很容易,但我们正处于从遗留构建和部署工具过渡的阶段,并且希望尽可能保持原始结构,直到我们可以完全切换到 Gradle。这是一个迭代过程,不可能一蹴而就。所以我需要一个临时解决方案。

java jar classpath gradle

5
推荐指数
1
解决办法
7091
查看次数

是否可以迭代位于类路径中的 jar 文件中的文件夹?

我有一些 Maven 依赖,里面有大量资源。我想在我的代码中迭代这些资源。我该怎么做?

我看到几个选项。

1)我可以用一些类似于此处所示的代码来读取Jat:Readcontents of jar file给定的特定路径

问题是我必须指定 mu jar 文件的确切路径,这是一个问题,因为:

  1. 它位于类路径中。我不知道确切的路径。
  2. 它可能会因版本而异,因为它包含工件版本。

2)我可以使用Resources.getResource或其他一些典型的“从类路径读取”方法来读取资源(例如:从jar中读取资源文件)。但我从未见过任何代码可以从某个文件夹中一一读取资源。仅读取具有预定义名称的一个资源的代码。

我的任务有什么理想的方法吗?

java resources jar classpath

5
推荐指数
0
解决办法
1958
查看次数

maven.plugin.classpath 和 maven.runtime.classpath 有什么区别

Maven 识别 4 个类路径:

  • maven.compile.classpath:编译源代码时需要位于类路径上的类和 jar。所以基本上对于maven-compiler-plugin

  • maven.test.classpath:运行单元测试或集成测试时需要位于类路径上的类和 jar

  • maven.runtime.classpath:我知道maven.runtime.classpath包含maven本身需要运行的jar和类。

  • maven.plugin.classpath:我知道当插件运行它自己的JVM时,这个类路径会传递给maven插件

问题:

  • 我对吗?
  • 插件是编译类路径的超集吗?
  • 测试是编译类路径的超集吗?
  • 当插件运行它自己的 JVM 时 - 传递给它的类路径是什么?
  • 有这方面的文档吗?

java classpath maven

5
推荐指数
1
解决办法
2119
查看次数

Spring无法使用@PropertySource找到类路径资源

我在数据源配置文件中使用@PropertySource来获取位于类路径上的属性文件。下面是我的项目结构。

在此输入图像描述

我相信我可以通过两种方式做到这一点:

  1. 通过在src文件夹中创建一个包并将它们添加到那里。由于src文件夹已包含在 Eclipse 的类路径中,因此以下操作应该有效。

@PropertySources({ @PropertySource("类路径:com/spring/property/general.properties"),@PropertySource("类路径:com/spring/property/hibernate.properties") })

  1. 第二种方法是创建一个resources文件夹并将其添加到类路径中,以下应该可以工作

@PropertySources({ @PropertySource("类路径:general.properties"), @PropertySource("类路径:hibernate.properties") })

就我而言,两者都不起作用。作为一名中级 Java 开发人员,这仍然让我感到困惑。任何人都可以引导我走向正确的方向。以及我们如何在生产环境中为 Spring 配置类路径资源。

编辑:我已经更改了我的项目结构以包含属性文件,src/java/resources并且我可以resources在构建路径中看到该文件夹​​。到了春天仍然.properties没有发现。

在此输入图像描述

java eclipse spring classpath

5
推荐指数
1
解决办法
3万
查看次数

运行 Java 命令,包括当前文件夹中的所有 JAR

我刚刚从 IDE 切换回记事本来编写 Java 程序。该程序使用 20 个 JAR。我编译成功了。当我决定使用运行Java类文件时

java -cp ".\\*" MyProgram
Run Code Online (Sandbox Code Playgroud)

它给出了标准错误“无法找到或加载主类......”。

我很困惑,因为当我过去java对现有文件夹中的所有文件运行命令时,它只会获取这些 JAR,因为当前文件夹已经在类路径中。由于程序是从当前文件夹运行的,因此我尝试-cp "."将其显式包含在类路径中,但这也不起作用。

最后我能够使用以下命令运行该程序:

java -cp ".\\*;." MyProgram.java
Run Code Online (Sandbox Code Playgroud)

我问这个问题是为了了解 Java 类路径背后的实际逻辑。

如果我错了,请纠正我,但我认为 JAR 只是一个标准存档,其中所有包都封装在各自的文件夹中。如果所有 JAR 都在我当前的文件夹中,包括我的主类文件,那么为什么我不能使用以下命令运行它:

java -cp "." MyProgram 
Run Code Online (Sandbox Code Playgroud)

或者简单地:

java MyProgram
Run Code Online (Sandbox Code Playgroud)

如果问题出在要包含的多个 JAR 文件上,这就是我们过去".\\*"在类路径中包含所有 JAR 的原因,那么为什么我们必须使用以下命令再次将当前文件夹显式包含在类路径中:

java ".\\*;." MyProgram
Run Code Online (Sandbox Code Playgroud)

java classpath

5
推荐指数
1
解决办法
6437
查看次数

覆盖 jar 中的属性文件

我的 Maven 依赖项的 .jar 之一中有一个属性文件。我想覆盖应用程序中的值,因此我创建了一个具有相同名称和相同包的文件,但仍使用 jar 文件中的值。如果我从 jar 中删除属性文件,则会使用应用程序中该文件的值。如何始终使用应用程序中的属性而不是 .jar ?

java classpath

5
推荐指数
1
解决办法
5374
查看次数

如何在 Visual Studio Code (v 1.27.2) 中设置 java 类路径?

我是 Visual Studio Code for Java 开发的新手,昨天打开了一个工作区进行测试。现在,当今天重新启动 Visual Studio 时,当我打开任何 java 文件时,我会收到“类路径不完整”警告,并且无法运行任何测试。查看一下肯定是工作区文件,它只包含以下内容。是否缺少设置类路径的内容,或者是否有其他方法来解决此问题?

{
    "folders": [
        {
            "path": "<path to project directory>"
        }
    ],
    "settings": {
        "java.configuration.updateBuildConfiguration": "automatic"
    }
}
Run Code Online (Sandbox Code Playgroud)

java classpath visual-studio-code

5
推荐指数
1
解决办法
1万
查看次数

Docker 主机之间的 Java 类路径排序不一致

我正在 Docker 映像中运行 Java 服务,其执行如下操作:

java -server -cp 'libs/*'

奇怪的是,我发现它会在我的本地计算机上启动,但不会在开发服务器上启动,在开发服务器上它会给出NoSuchMethodError.

经过一番挖掘,我发现 libs 目录中同时存在 JPA 2.0 和 2.1 版本。虽然这本身就是一个问题(并且很容易修复),但它并不能解释不一致的原因,所以我决定打印出来:

(ClassLoader.getSystemClassLoader() as URLClassLoader).urLs
    .forEach(::println) // kotlin
Run Code Online (Sandbox Code Playgroud)

我发现两台机器上的库顺序不同。然而,在同一台机器上后续运行的图像之间是一致的,所以不是随机的。

虽然我现在知道为什么镜像无法在开发服务器上启动,并且我可以解决手头的问题,但它确实让我想知道:为什么这个顺序在 Docker 主机上不一致?可复现性和一致性不正是Docker的要点之一吗?类路径的顺序是否取决于 IP、主机名或安装的主机目录(在不相关的位置)等挑剔的事物?

java classpath classloader urlclassloader docker

5
推荐指数
1
解决办法
469
查看次数