如何动态+有条件地调用类的方法?
(类最终不在类路径中)
让我们说,我需要这个类NimbusLookAndFeel,但在某些系统上它是不可用的(即OpenJDK-6).
所以我必须能够:
public static void setNimbusUI(final IMethod<UIDefaults> method)
throws UnsupportedLookAndFeelException {
// NimbusLookAndFeel may be now available
UIManager.setLookAndFeel(new NimbusLookAndFeel() {
@Override
public UIDefaults getDefaults() {
UIDefaults ret = super.getDefaults();
method.perform(ret);
return ret;
}
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:
现在我按照建议编辑了我的代码,NoClassDefFoundError使用try-catch 拦截.它失败.我不知道,如果是OpenJDK的错.我得到了InvocationTargetException,造成的NoClassDefFoundError.有趣,我无法抓住InvocationTargetException:无论如何它都被扔了.
EDIT2: :
原因发现:我包裹SwingUtilities.invokeAndWait(...)周围的测试方法,那很invokeAndWait调用抛出NoClassDefFoundError时加载雨云失败.
EDIT3: :
任何人都可以请澄清其中 …
我应该如何添加JAR库在Eclipse中一个WAR项目没有遇到java.lang.ClassNotFoundException或java.lang.NoClassDefFoundError?
在CLASSPATH环境变量似乎并没有工作.在某些情况下,我们将JAR文件添加到Eclipse项目的Build Path属性中以使代码编译.我们有时需要将JAR文件放在/WEB-INF/libJava EE Web应用程序的文件夹中,以使代码在该JAR内的类上运行.
我不完全理解为什么CLASSPATH不起作用,在哪些情况下我们应该将JAR添加到Build Path以及何时应该放置这些JAR /WEB-INF/lib.
Eclipse的JDT编译器提供了一个接口INameEnvironment,该接口定义了findType(...)使您能够进行级联编译的方法.奇怪的是我想知道是否有任何方法可以使用标准的JDK编译工具包来做到这一点?
注意,该场景是一个模板引擎,它在内存编译中为模板文件生成的类进行相互依赖,并且它无法预测您遇到模板文件的顺序,因此Foo可能需要先编译才能进行父Bar编译,因此你需要一个机制来进行级联编译,这意味着在编译期间Foo你需要生成另一个源Bar并首先编译它以便继续Foo编译:一些代码如下:
private NameEnvironmentAnswer findType(final String name) {
try {
if (!name.contains(TemplateClass.CN_SUFFIX)) {
return findStandType(name);
}
char[] fileName = name.toCharArray();
TemplateClass templateClass = classCache.getByClassName(name);
// TemplateClass exists
if (templateClass != null) {
if (templateClass.javaByteCode != null) {
ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode, fileName, true);
return new NameEnvironmentAnswer(classFileReader, null);
}
// Cascade compilation
ICompilationUnit compilationUnit = new CompilationUnit(name);
return new NameEnvironmentAnswer(compilationUnit, null);
}
// So it's …Run Code Online (Sandbox Code Playgroud) 我正试图推出:
java -jar selenium-server-standalone-2.14.0.jar -role hub
Run Code Online (Sandbox Code Playgroud)
从我的命令提示符,但输出如下:
C:\Program Files (x86)>java -jar selenium-server-standalone-2.14.0.jar -role hub
Unable to access jarfile selenium-server-standalone-2.14.0.jar
Run Code Online (Sandbox Code Playgroud)
C:\ Program Files(x86)是jar文件所在的位置.
我把C:\ Program Files(x86)放在我的PATH和CLASSPATH中,它仍然无法正常工作.
我正在尝试运行另一个人创建的已经存在的eclipse项目.
在将其导入eclipse并尝试运行As-> Java Application之后,它失败了,因为它无法在bin/resources中找到.properties文件
我打印出eclipse正在使用的类路径
logger.info(System.getProperty("java.class.path"));
Run Code Online (Sandbox Code Playgroud)
当然,它包括bin,以及所有lib/*.jars,但不包括bin/resources.将.properties文件复制到bin中会使程序正常工作,但我想了解如何将目录添加到eclipse类路径中.
我尝试了几件事,但都没有
export CLASSPATH=$CLASSPATH:/home/me/programdir/bin/resources
Run Code Online (Sandbox Code Playgroud)
这没用.我理解这不是解决这个问题的理想方法,但我认为它会解决问题(我有更多的窗口而不是linux背景所以也许我错过了linux中系统变量的一些细微差别)
接下来,我尝试在Eclipse中的Run-> Configurations对话框中修改VM参数
-classpath "/home/me/programdir/bin/resources"
Run Code Online (Sandbox Code Playgroud)
这里也没有运气,这让我很困惑,因为我确信它会起作用,对于需要在类路径中添加一个额外文件夹的特定程序来说,这似乎是一个合理的解决方案.
接下来我尝试直接修改build.xml.我找到了定义类路径的部分,并为bin/resources添加了我自己的行,如下所示:
<path id="classpath">
<fileset dir="./bin/resources" includes="**/*.properties"/>
<fileset dir="./lib" includes="**/*.jar" />
</path>
Run Code Online (Sandbox Code Playgroud)
这也是不成功的.这让我更加困惑,所以我注释掉了整个路径元素,并且记录器打印出的类路径没有改变,所以很明显,无论使用什么类路径eclipse,它肯定不是这个.在我看来这是最好的解决方案,如果它有效:build.xml文件可以使用正确的添加进行检查,以防止将来的用户遇到问题.
接下来我尝试了IDE方法.运行 - >配置 - >类路径 - >用户条目 - >高级,只需添加bin/resources文件夹.这完美,程序找到属性文件,一切都很好.但是,我不满意我以前的努力失败了,没有我真正理解为什么.似乎每个人都应该工作.
另外,我想确保以这样的方式修复此问题,即我检入的代码捕获它,以便后续用户不必执行相同的步骤.因此我的解决方案并不十分令人满意,因为我不确定实际的代码片段是如何更改的,因此无法验证是否已签入"修复".
你如何找到eclipse用于其类路径的实际定义?我曾以为这将是build.xml类路径定义,但似乎根本不是这样.
尝试运行使用jackon的ObjectMapper类的java程序时出现以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at com.inin.dynamotransfer.DynamoTransfer.importData(DynamoTransfer.java:133)
at com.inin.dynamotransfer.DynamoTransfer.main(DynamoTransfer.java:67)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 2 more
Run Code Online (Sandbox Code Playgroud)
我有杰克逊的注解,数据绑定(包含ObjectMapper),以及核心的JAR文件中在〜/ .m2目录/库我的Maven仓库/ COM/fasterxml /杰克逊/核心/ jackson- [包名] /2.4.0.这是我的pom.xml的依赖项部分:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
这是我的CLASSPATH:
:/Users/myusername/Library/Java/Extensions:/Library/Java/Extensions:/Users/myusername/.m2/repository
Run Code Online (Sandbox Code Playgroud)
所以Maven知道所有这些JAR - 在哪里获取em,在哪里放em等等 - 但java本身似乎无法找到我需要的类.我究竟做错了什么??谢谢!
我知道还有其他一些问题......
但我的问题似乎有点不同,因为我似乎有所有必要的事情没有这个问题.
代码:
this.getClass().getResource("checkstyle_whitespace.xml"); // null
Run Code Online (Sandbox Code Playgroud)
问题是我通过检查调试器中的类加载器来验证我的类路径.这就是我所看到的:
27 = {URL@1235} "file:/Users/dennis/Documents/Development/java/java-grader/build/classes/main/"
28 = {URL@1236} "file:/Users/dennis/Documents/Development/java/java-grader/build/resources/main/"
Run Code Online (Sandbox Code Playgroud)
Blow是tree我的目录结构的一个快速.见build/resources和src/main/resources.当gradle构建我的项目时,正在复制文件.
??? build
? ??? classes
? ? ??? main
? ? ? ??? javaGrader
? ? ??? test
? ? ??? javaGraderTest
? ??? resources
? ??? main
? ??? checkstyle_whitespace.xml
? ??? grammars
??? src
? ??? main
? ? ??? java
? ? ? ??? javaGrader
? ? ??? resources …Run Code Online (Sandbox Code Playgroud) Weblogic 10.3.1.0正在使用com.bea.core.apache.commons.net_1.0.0.0_1-4-1.jar ...我想从我的代码中使用commons-net-2.0.jar.
如何强制它仅在我的代码中使用较新的JAR?
我需要在当前类路径中为我编写的用于运行java文件的ant脚本添加一个文件夹.怎么做到呢?
我有以下自定义程序集:
<assembly>
<id>full</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
以下配置部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>com.example.MyExample</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>./lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
根据有关maven程序集插件的文档,这应该将一个类路径项添加到清单文件中,但它不起作用.如果我使用已弃用的程序集目标而不是单个目标,它确实有效.
我注意到有人提到存档部分只有jar格式,但这就是我正在使用的.
当他们弃用程序集:汇编时,他们是否定义了一种正确执行此操作的新方法?我真的不喜欢使用已弃用的功能,但如果它们破坏了工作方式并且没有正确记录它,我真的不知道如何避免这种情况.
有没有人有任何正确的例子?