标签: classpath

Java:如何动态覆盖类的方法(类最终不在类路径中)?

如何动态+有条件地调用类的方法?
(类最终不在类路径中)

让我们说,我需要这个类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: :
任何人都可以请澄清其中 …

java reflection openjdk classpath nimbus

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

如何在不面对java.lang.ClassNotFoundException的情况下将JAR库添加到WAR项目中?Classpath vs Build Path vs/WEB-INF/lib

我应该如何添加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 jar war classpath java-ee

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

使用javax.tool级联内存编译

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 compiler-construction classpath classloader in-memory

10
推荐指数
1
解决办法
624
查看次数

无法从CMD打开Selenium Jar文件.路径或ClassPath问题?

我正试图推出:

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中,它仍然无法正常工作.

cmd path selenium-grid classpath executable-jar

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

如何将目录添加到eclipse类路径?

我正在尝试运行另一个人创建的已经存在的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类路径定义,但似乎根本不是这样.

eclipse classpath

10
推荐指数
2
解决办法
4万
查看次数

java.lang.ClassNotFoundException/NoClassDefFoundError for com/fasterxml/jackson/databind/ObjectMapper with Maven

尝试运行使用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本身似乎无法找到我需要的类.我究竟做错了什么??谢谢!

java classpath maven fasterxml

10
推荐指数
2
解决办法
4万
查看次数

getResource()使用Gradle项目返回null

我知道还有其他一些问题......

但我的问题似乎有点不同,因为我似乎有所有必要的事情没有这个问题.

代码:

 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)

java resources classpath gradle

10
推荐指数
1
解决办法
6780
查看次数

Weblogic 10.3.1.0正在使用com.bea.core.apache.commons.net_1.0.0.0_1-4-1.jar ...我想从我的代码中使用commons-net-2.0.jar

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 weblogic classpath weblogic-10.x

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

如何在类路径中为ant脚本添加一个文件夹?

我需要在当前类路径中为我编写的用于运行java文件的ant脚本添加一个文件夹.怎么做到呢?

java ant classpath

9
推荐指数
2
解决办法
2万
查看次数

使用自定义程序集描述符将类路径添加到清单

我有以下自定义程序集:

<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格式,但这就是我正在使用的.

当他们弃用程序集:汇编时,他们是否定义了一种正确执行此操作的新方法?我真的不喜欢使用已弃用的功能,但如果它们破坏了工作方式并且没有正确记录它,我真的不知道如何避免这种情况.

有没有人有任何正确的例子?

classpath maven-3 maven maven-assembly-plugin

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