如果类路径中有两个包含同一类的不同版本的jar,则classpath顺序变得至关重要.
我正在寻找一种工具,可以检测和标记给定类路径或文件夹集中的此类潜在冲突.
当然是一个开始的脚本:
classes=`mktemp`
for i in `find . -name "*.jar"`
do
echo "File: $i" > $classes
jar tf $i > $classes
...
done
Run Code Online (Sandbox Code Playgroud)
有一些聪明的排序/ uniq/diff/grep/awk以后有潜力,但我想知道是否有人知道任何现有的解决方案.
我一直在寻找从命令行编译和运行Java程序,我一直看到设置类路径的不同版本:-cp vs -classpath.我想这些是相同的,但是比我更有知识的人可以证实或反驳这一点吗?
在Maven中,您可以拥有编译时依赖项和测试依赖项.这是我喜欢的功能,M2Eclipse插件也可以在Eclipse中使用,这很棒.因此,如果我将jmock.jar我的项目添加为测试依赖项,它将显示在JUnit测试的类路径中,但在我调试应用程序本身时将不会出现.
这正是我现在想要实现的目标,但没有M2Eclipse或Maven.有没有办法在纯Eclipse中执行此操作?(可能没有安装任何插件.)
我有一个JAR文件,其中包含该应用程序的应用程序和配置文件.应用程序从类路径(使用ClassLoader.getResource())加载配置文件,并使用烘焙到JAR文件中的配置文件完全满足其依赖关系.
有时我希望应用程序以稍微不同的配置运行(特别是我想覆盖JDBC URL以指向不同的数据库)所以我创建了一个新的配置文件,将其存储在正确的目录结构中(这意味着在/config类路径条目的目录),我想做这样的事情:
java -cp new-config:. -jar application.jar
Run Code Online (Sandbox Code Playgroud)
但我不能让类new-config路径在应用程序JAR的内容之前有路径条目.它是硬编码的,JAR的内容始终是类路径中的第一件事吗?
我正在使用maven-compile插件来编译类.现在我想在当前的类路径中添加一个jar文件.该文件保留在另一个位置(假设c:/jars/abc.jar.我更喜欢将此文件保留在此处).我怎样才能做到这一点?
如果我在参数中使用classpath:
<configuration>
<compilerArguments>
<classpath>c:/jars/abc.jar</classpath>
</compilerArguments>
</configuration>
Run Code Online (Sandbox Code Playgroud)
它将无法工作,因为它将覆盖当前的类路径(包括所有依赖项)
请帮我.
操作系统名称:"linux"版本:"2.6.32-27-generic"arch:"i386"系列:"unix"
Apache Maven 2.2.1(r801777; 2009-08-06 12:16:01-0700)
Java版本:1.6.0_20
我试图在ubuntu中使用maven与maven相关联.如果我移动maven下载到我的$ JAVA_HOME/jre/lib/ext /文件夹中的"mysql-connector-java-5.1.14.jar"文件,那么当我运行jar时一切都很好.
我想我应该只能在pom.xml文件中指定依赖项,maven应该自动设置依赖项jar的类路径.这是不正确的?
我的pom.xml文件如下所示:
<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>com.ion.common</groupId>
<artifactId>TestPreparation</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>TestPrep</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.ion.common.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- JUnit testing dependency -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)
命令"mvn package"构建它没有任何问题,我可以运行它,但是当应用程序尝试访问数据库时,会出现以下错误:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at …Run Code Online (Sandbox Code Playgroud) 我一直在寻找这个问题的解决方案今天和昨天的几个小时,所以我决定在这里解决它,虽然这似乎是一个愚蠢的问题.
情况:我在Eclipse Java EE中设置了一个Google AppEngine项目.它可以在一周内运行良好,我可以部署到App Engine并在没有probs的情况下在Eclipse中进行测试.
现在我需要为fe JSON支持和Google Visualization API添加JAR包.我一周前尝试过JSON,因为它失败了,我只是下载了源文件并将它们添加到我自己的源代码中.但现在使用可视化的东西,它是太多的源文件,所以我需要JAR工作.
我做了什么:
发生了什么:一切顺利,我可以导入类并从中创建子类而没有错误.所以很明显,Eclipse认识到了类的存在,Eclipse已成功导入它们.
然后我尝试构建它(调试模式)并得到以下错误(我用JSON得到的那个):
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed chartDataServlet: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed com.google.appengine.tools.development.DevAppEngineWebAppContext@727db937{/,/Volumes/Data/eclipse_workspace/kulStats/war}: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed JettyContainerService$ApiProxyHandler@409bad4f: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) …Run Code Online (Sandbox Code Playgroud) 我正在使用Typesafe Config(https://github.com/typesafehub/config)来参数化使用配置文件在yarn-cluster模式下运行的Spark作业.Typesafe Config的默认行为是在类路径中搜索名称与正则表达式匹配的资源,并自动将它们加载到配置类中ConfigFactory.load()(为了我们的目的,假设它调用的文件被调用application.conf).
我可以使用配置文件加载到驱动程序中--driver-class-path <directory containing configuration file>,但是使用--conf spark.executor.extraClassPath=<directory containing configuration file>不会将资源放在所有执行程序的类路径上.执行程序报告他们找不到我尝试添加到其类路径的配置文件中存在的密钥的某个配置设置.
使用Spark将文件添加到所有执行程序JVM的类路径的正确方法是什么?
我已经看到很多方法使用用户类路径作为hadoop的先例.通常,如果m/r作业需要特定版本的库,而hadoop巧合地已使用旧版本(例如jackson的json解析器或commons http等),则会执行此操作.
无论如何:我见过:
mapreduce.task.classpath.user.precedence
mapreduce.task.classpath.first
mapreduce.job.user.classpath.first
Run Code Online (Sandbox Code Playgroud)
这些参数中的哪一个是在我的作业配置中设置的正确参数,以便强制映射器和缩减器具有hadoop_classpath在hadoop默认依赖关系罐之前放置用户定义的jar 的类路径?
顺便说一句,这与这个问题有关: 我最近发现的Dynamodb requestHandler接受是由于jar冲突造成的.
我似乎无法找到关于是否仍然可以在运行时扫描所有可用类(用于接口,注释等)的任何信息,就像Spring,Reflections和许多其他框架和库当前所做的那样,面对Jigsaw相关的更改类的加载方式.
编辑:这个问题是关于扫描寻找类的真实物理文件路径.另一个问题是关于动态加载类和资源.这是相关的,但非常重复.
更新:Jetty项目为此制定了标准化API的 JEP建议.如果你有办法帮助实现这个目标,请做.否则,等待和希望.
更新2:找到这个相关的发声帖子.引用后代的代码片段:
如果您真的只是想了解启动层中的模块内容(启动时解析的模块),那么您将执行以下操作:
ModuleLayer.boot().configuration().modules().stream()
.map(ResolvedModule::reference)
.forEach(mref -> {
System.out.println(mref.descriptor().name());
try (ModuleReader reader = mref.open()) {
reader.list().forEach(System.out::println);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
});
Run Code Online (Sandbox Code Playgroud) java classpath java-platform-module-system java-9 java-module
classpath ×10
java ×6
jar ×5
eclipse ×2
apache-spark ×1
dependencies ×1
hadoop ×1
hadoop-yarn ×1
java-9 ×1
java-module ×1
java-platform-module-system ×1
maven ×1
maven-2 ×1
unit-testing ×1