我正在使用标准Maven目录结构设置的项目,因此我有一个名为"resources"的文件夹,在此我创建了一个名为"fonts"的文件夹,然后在其中放入一个文件.我需要将完整的String文件路径(位于我的项目结构中的文件resources/fonts/somefont.ttf)传递给我正在使用的对象,来自第三方库,如下所示,我已经搜索了一段时间但是已经对于这样做的正确方法感到有点困惑.我尝试过如下,但无法找到它.我看着使用ResourceBundle但似乎涉及制作一个实际的File对象,当我只需要传递给下面的方法的路径(没有在我面前的实际方法调用,所以只是从我的记忆中给出一个例子) :
FontFactory.somemethod("resources/fonts/somefont.ttf");
Run Code Online (Sandbox Code Playgroud)
我曾经想过有一种方法,使用标准Maven目录结构的项目从资源文件夹中获取文件,而不必使用类/包中的完整相对路径.对此有任何建议非常感谢.
我不想使用硬编码路径,因为在项目上工作的不同开发人员有不同的设置,我想将其作为项目的一部分包含在内,以便他们在签出项目源时直接获得它.
这是一个Web应用程序(Struts 1.3应用程序),当我查看爆炸的WAR文件(我通过Tomcat运行项目)时,该文件位于:
<Exploded war dir>/resources/fonts/somefont.ttf
Run Code Online (Sandbox Code Playgroud) 我正在用Groovy编写一个脚本,我希望有人能够通过运行来执行它./myscript.groovy.但是,这个脚本需要第三方库(MySQL JDBC),我不知道有什么方法可以通过一个-classpath或者-cp参数来提供脚本,例如
`./monitor-vouchers.groovy -cp /path/to/mysql-lib.jar`
Run Code Online (Sandbox Code Playgroud)
由于我不会进入这里的原因,实际上不可能使用-classpath/-cp参数向脚本提供JAR位置.有什么方法可以从脚本本身加载JAR吗?我试过用@Grab
import groovy.sql.Sql
@Grab(group='mysql', module='mysql-connector-java', version='5.1.19')
def getConnection() {
def dbUrl = 'jdbc:mysql://database1.c5vveqm7rqgx.eu-west-1.rds.amazonaws.com:3306/vouchers_prod'
def dbUser = 'pucaroot'
def dbPassword = 'password'
def driverClass = "com.mysql.jdbc.Driver"
return Sql.newInstance(dbUrl, dbUser, dbPassword, driverClass)
}
getConnection().class
Run Code Online (Sandbox Code Playgroud)
但这会导致以下错误:
Caught: java.sql.SQLException: No suitable driver
java.sql.SQLException: No suitable driver
at monitor-vouchers.getConnection(monitor-vouchers.groovy:13)
at monitor-vouchers.run(monitor-vouchers.groovy:17)
Run Code Online (Sandbox Code Playgroud)
有没有办法可以使用just执行这个脚本 ./monitor-vouchers.groovy
每当在以感叹号结尾的目录中运行可执行jar时,getResourceAsStream -method都返回null.
对于以下示例,我有一个Eclipse项目具有以下目录结构:
src\ (Source Folder)
main\ (Package)
Main.java
res\ (Source Folder)
images\
Logo.png
Run Code Online (Sandbox Code Playgroud)
我正在阅读Logo.png如下:
public static void main(String[] args) throws IOException {
try (InputStream is = Main.class.getClassLoader().getResourceAsStream("images/Logo.png")) {
Image image = ImageIO.read(is);
System.out.println(image);
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅2个测试用例的附件.首先,可执行jar从目录"D:\ test123!@#"启动而没有任何问题.其次,可执行jar从目录"D:\ test123!@#!!!"启动,有问题.
是否不支持以感叹号结尾的目录?代码错了吗?
提前致谢.

我的一个项目打包为一个EAR文件,其中包含SLF4J API(1.7.5)以及作为其实现(logback-core 1.0.13和logback-classic 1.0.13)的logback库.
当我(以前)部署我的项目时,SLF4J的LoggerFactory发现logback尽可能绑定并使用正确的记录器(即logback).
现在我有一个资源连接器(activemq-rar-5.8.0.rar),它在我自己的EAR文件之前部署(因为EAR文件需要RAR).不幸的是,这个RAR包含自己的SLF4J实现(slf4j-api-1.6.6.jar slf4j-log4j12-1.6.6.jar log4j-1.2.17.jar).RAR文件使用log4j实现.
当我部署我的EAR文件时,我的应用程序代码中的LoggerFactory突然使用log4j实现(org.slf4j.impl.Log4jLoggerAdapter) - 即使我希望类路径与RAR分离.
这似乎不是这样 - 所以我做错了什么(RAR应该使用log4j,我的EAR应该使用logback)?
更新1: 看起来我并不孤单,但不幸的是,答案遗失了......
更新2:
根据此表,GlassFish在EAR/WAR库之前加载连接器模块(这是最后要加载的库).
更新3:
我设法修复了"绑定":如果我将slf4j-api-1.7.5.jar和logback实现(logback-core-1.0.13.jar和logback-classic-1.0.13.jar)放在domains/<myDomain>/libGlassFish 的文件夹中,则logback将用作日志记录实现(请参阅Update 2 - "Common Classloader"在"Connector Classloader"之前).
不幸的是我的配置文件不再存在,因为它们在WAR/EAR中 - 稍后将由不同的类加载器("Archive Classloader")加载.
所以这对我来说并不是真正的解决方案,因为我希望将回溯配置文件保留在EAR/WAR中(因为每个应用程序都使用不同的配置).
亲切的问候
stupidSheep
使用WebSphere Liberty Profile(版本2013.11.0.0 - 8.5.5.Next Alpha和扩展内容)启动我的应用程序时,会出现很多警告:
W SRVE9967W: The manifest class path dhbcore.jar can not be found in jar file wsjar:file:[blablabla] or its parent.
W SRVE9967W: The manifest class path jms.jar can not be found in jar file wsjar:file:[blablabla] or its parent.
W SRVE9967W: The manifest class path com.ibm.mq.jmqi.jar can not be found in jar file wsjar:file:[blablabla] or its parent.
W SRVE9967W: The manifest class path dhbcore.jar can not be found in jar file wsjar:file:[blablabla] or its parent.
W SRVE9967W: …Run Code Online (Sandbox Code Playgroud) 故意破坏下面的代码以识别NullPointerException的来源,这应该是非常简单的,但结果却让我疯狂:
Properties properties = new Properties();
Thread currentThread = Thread.currentThread();
ClassLoader contextClassLoader = currentThread.getContextClassLoader();
InputStream propertiesStream = contextClassLoader.getResourceAsStream("resource.properties");
if (propertiesStream != null) {
properties.load(propertiesStream);
// TODO close the stream
} else {
// Properties file not found!
}
Run Code Online (Sandbox Code Playgroud)
我收到"未找到属性文件!" 错误,即contextClassLoader.getResourceAsStream("resource.properties"); 返回null.
这是一个基于CXF的客户端和我验证了"resource.properties"文件是在当前目录中的客户端的jar驻留(和运行).
我还通过包含以下诊断代码验证了绝对路径:
File file = new File("resource.properties");
System.out.println(file.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
绝对路径指向客户端jar的位置.
我也尝试使用以下方法找出类加载器的上下文:
System.out.println(Thread.currentThread().getContextClassLoader());
Run Code Online (Sandbox Code Playgroud)
但相反,这里演示了一些目录结构,我得到的是:
com.simontuffs.onejar.JarClassLoader@1decdec
为什么ClassLoader.getResourceAsStream()会返回null?
我错过了什么?
我有一个关键的类路径顺序问题,因此我需要确保JAR 1在类路径中位于JAR 2之前.
有没有办法在Eclipse IDE中的GRADLE_DEPENDENCIES中强制执行此操作.
在打包应用程序(分发)期间如何实现相同的任何见解?
我正在尝试@PropertySource在Jar中使用Spring框架的注释来从jar外部加载属性文件,但它没有找到该文件.
我需要将属性文件放在Jar的外部,以便进行编辑.我不知道文件的确切位置,我想我可以把它放在类路径的任何地方.
我在Config课堂上使用以下注释.
@PropertySource('classpath:stc.properties')
Run Code Online (Sandbox Code Playgroud)
并stc.properties与创建的Jar文件放在同一目录中.我尝试在java命令中显式指定类路径,但它仍然无法找到该文件:
java -cp . -jar stc.jar
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load bean class: com.example.stc.Config; nested exception is java.io.FileNotFoundException: class path resource [stc.properties] cannot be opened because it does not exist
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:162)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:299)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:609)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
[...]
Run Code Online (Sandbox Code Playgroud)
等等.
我也尝试使用./类路径,并尝试Class-Path在jar的清单的属性中指定类路径(包含两个变体),但它总是给出相同的结果.
在Glassfish 4.1中,我正在运行一个企业应用程序。我已经将maven用于耳朵包装。依赖项jar保留在ear / lib文件夹中。在这些jar中,有一些jar的清单中有Class-Path条目。
以batik-js-1.7.jar其中Class-Path: xbean.jar的清单条目为例,其中没有版本字符串。该xmlbeans-2.3.0.jar是在lib文件夹。由于此jar文件的文件名中包含版本字符串,因此Glassfish会抛出警告消息:
PWC6351: In TLD scanning, the supplied resource file:<path_to_server_ear>/lib/xbean.jar does not exist。
现在,如果我通过的配置在打包耳朵时移除了版本字符串<fileNameMapping>no-version</fileNameMapping>,maven-ear-plugin则对于此jar而言,警告消息不再出现,但对其他Manifest的Class-Path条目具有带有版本字符串的jar名称的jar造成了同样的警告。
如何解决此警告消息问题?无论如何,在进行Maven打包时是否要从清单中删除类路径条目,或者告诉Glassfish不要扫描清单中的类路径?
我正在开发一个用户可以在原始Java代码中存储插件的项目.然后我的应用程序将获取这些插件,编译它们并导入它们.这些类基于存储在我的jar中的接口.但是,当我尝试使用JavaCompiler.CompilationTask运行它时,它拒绝允许我将当前jar添加到编译器的类路径中.在这种情况下,当它试图编译它时,就好像接口不可用于实现一样.
这是我的文件的结构:
主.jar文件:
CommandProcessor.java
----------------------------------------------
package plugins;
public interface CommandProcessor {
public String onCommand(String command);
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个加载插件的功能.
http://hastebin.com/jabacopeye.coffee(HasteBin避免过于混乱的问题)
以下是其中一个用户插件的示例:
public class MyCommand implements plugins.CommandProcessor {
@Override
public String onCommand(String command){
return "this is a test";
}
}
Run Code Online (Sandbox Code Playgroud)
每当应用程序尝试编译这个外部存储的.java文件时,它都会说"plugins.CommandProcessor"类不存在.