我的代码在一个JAR文件中运行,比如说foo.jar,我需要在代码中知道运行foo.jar的文件夹.
所以,如果foo.jar在C:\FOO\,我想要获得该路径,无论我当前的工作目录是什么.
我有一个JAR文件,我的所有代码都存档以便运行.我必须访问每次运行前需要更改/编辑的属性文件.我想将属性文件保存在JAR文件所在的目录中.有没有告诉Java从该目录中获取属性文件?
注意:我不想将属性文件保留在主目录中,也不希望在命令行参数中传递属性文件的路径.
有没有办法获取正在运行的java程序的主类的路径.
结构是
D:/
|---Project
|------bin
|------src
Run Code Online (Sandbox Code Playgroud)
我希望得到这样的道路D:\Project\bin\.
我试过System.getProperty("java.class.path");但问题是,如果我跑的话
java -classpath D:\Project\bin;D:\Project\src\ Main
Output
Getting : D:\Project\bin;D:\Project\src\
Want : D:\Project\bin
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
=====编辑=====
得到了解决这里
package foo;
public class Test
{
public static void main(String[] args)
{
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("foo/Test.class"));
}
}
Run Code Online (Sandbox Code Playgroud)
打印出来的:
file:/C:/Users/Jon/Test/foo/Test.class
Run Code Online (Sandbox Code Playgroud)
解决方案2(由 Erickson提供)
URL main = Main.class.getResource("Main.class");
if (!"file".equalsIgnoreCase(main.getProtocol()))
throw new IllegalStateException("Main class is not stored in a file.");
File path = new File(main.getPath());
Run Code Online (Sandbox Code Playgroud)
请注意,大多数类文件都组装成JAR文件,因此在每种情况下都不起作用(因此 …
有没有办法在运行时从这个类的代码确定已执行类的当前文件系统位置,因为它是使用java命令执行的?
例如,对于以下类:
public class MyClass{
public static void main(String[] args){\
new MyClass().doStuff();
}
private void doStufF(){
String path = ... // what to do here?!
System.out.println("Path of class being invoked: " + path);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在调用MyClass.class文件的文件系统中获取和打印正确的路径?
同样,如果我从java -jar命令调用jar文件,有没有办法从该jar内的类中获取jar文件的路径?
PS:请不要做任何假设有关工作目录从java被调用的命令!
这个问题以前曾被问过,但不幸的是,似乎没有任何解决方案对我有用.我正面临这个异常(使用删节堆栈跟踪):
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:221)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
Run Code Online (Sandbox Code Playgroud)
使用命令行Maven进行编译时以及部署到Tomcat时会发生这种情况.它在IntelliJ IDEA中工作正常.
通常我希望这是由正在使用的SLF4J库的多个版本引起的.但Maven依赖树在单个版本中显示所有slf4j库:
..$ mvn dependency:tree | grep slf4j
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.4:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.6.4:compile
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.6.4:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile
Run Code Online (Sandbox Code Playgroud)
我甚至确保〜/ .m2/repository中没有其他JAR
也没有对commons-logging库的引用(我将它们全部排除在依赖树之外.
我该如何解决这个问题?我的想法已经不多了.
编辑:这里要求完整的依赖项,首先是父POM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${org.hibernate.validator.version}</version>
<exclusions>
<!-- Exclude SLF4j to avoid version conflicts (we have 1.6.2, this drags in 1.6.1) -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>${org.hibernate.validator.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) 如果类路径中有两个包含同一类的不同版本的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程序,它需要获得当前运行类的路径.类文件位于C:\ 2013\game \文件夹中.
要获得此路径,我在主类构造函数中调用此代码段:
public game(){
String testPath = this.getClass().getResource("").getPath();
//Rest of game
}
Run Code Online (Sandbox Code Playgroud)
但是,此命令将返回此字符串:"/"尽管正确的输出为"C:/ 2013/game"此外,我尝试使用此代码来纠正此问题:
public game(){
String testPath = this.getClass().getClassLoader().getResource("").getPath();
}
Run Code Online (Sandbox Code Playgroud)
这会返回一个NullPointerException,它源于getClassLoader()返回null的事实,尽管我在Eclipse IDE上工作.有任何想法吗?
插件xyz应该在Java项目之上运行并生成一些Java代码.这段代码需要在构建和运行时插件的jar中提供的类.因此,插件的jar(或安装目录)应该出现在构建类路径中.
一个插件如何找到它自己的jar /安装目录的确切路径,或者就此而言,以便携方式找到一些相关插件jar的路径?
背景是我想制作一个用户可以运行的向导来启用项目的xyz特性.应为用户提供有意义的默认值,以便在何处查找所需的运行时功能,并将给定的库添加到构建路径中.
java ×8
jar ×3
classpath ×2
filepath ×2
classloader ×1
dependencies ×1
eclipse ×1
maven ×1
path ×1
properties ×1
slf4j ×1