Tag: classpath

在OSGi Bundle中使用JavaCompiler

我正在重构Java应用程序以使用OSGi。 该应用程序的一个function是使用javax.tools.JavaCompiler Java编译。 在原始应用程序中,此过程通过向编译器提供现有类路径来完成,就像这样。 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); String[] options = {“-classpath”, System.getProperty(“java.class.path”)}; DiagnosticListener listener = new DiagnosticListener() {…}; StandardJavaFileManager fileManager = compiler.getStandardFileManager(listener, null, null); Iterable fileObjects = fileManager.getFileObjects(sourceFile); CompilationTask task = compiler.getTask(null, fileManager, listener, Arrays.asList(options), null, fileObjects); task.call(); 但是,这在OSGi包中不起作用,因为类路径不再包含所需的路径。 在重构的OSGi版本的应用程序中,编译器需要访问与上述代码在同一个包中的类,以及来自其他包的类。 如何让编译器知道这些类? 我想到了两种可能的解决方案: 为编译器提供包含上述代码的bundle使用的类加载器,因为它知道所有必需的类。 但是,从我在这里和这里读到的内容来看,这似乎不是一个可行的解决方案。 使用已安装捆绑包的物理位置构建类路径。 我查看了org.osgi.framework.Bundle.getLocation()但我不确定这是否是一个可靠的解决方案。 我得到的路径(至少在Eclipse中部署时)是相对的,我不确定它们是否可以安全地在所有平台和情况下使用。 上面的选项2似乎可能吗? 有更好的解决方案吗?

类加载器如何在清单类路径中加载类引用?

我使用maven来构建一个带有外部类路径添加的jar,使用addClasspath 。 当我使用java -jar artifact.jar运行该jar时,它能够从该主jar和libs目录中的所有jar加载类。 但是,如果我问系统属性java.class.path它将只列出主jar。 如果我向系统类加载器询问其url( ClassLoader.getSystemClassLoader().getURLs() ),它也只会返回主jar。 如果我询问某个库中包含的任何类的类加载器,它将返回系统类加载器。 系统类加载器如何加载这些类? 它必须对这些库有一些了解才能从这些库中加载类。 有没有办法要求它使用这种“扩展”类路径?

有没有办法判断类路径资源是文件还是目录?

例如,假设com.google包存在于某个JAR(例如,Guava)中,此片段会在stream.read()行上抛出NullPointerException(!)。 ClassLoader classLoader = getClass().getClassLoader(); URL resource = classLoader.getResource(“com/google”); InputStream stream = resource.openStream(); System.out.println(stream.toString()); // Fine — stream is not null stream.read(); // NPE inside FilterInputStream.read()! 如果com/google与文件系统中的软件包而不是JAR交换,那么该代码段根本不会崩溃。 事实上,它似乎读取了该目录中的文件,由换行符分隔,但我无法想象在任何地方都指定了行为。 如果资源路径“com / google”指向“普通”资源文件或目录,是否有方法测试?

执行Mavenunit testing,并将classpath设置为生成的项目JAR

我的应用程序中的某些unit testing与查找和操作属于应用程序本身的某些文件资源有关。 我需要在应用程序的实际生产设置中执行这些测试,它将其部署为JAR文件,而不是作为展开的目录。 我怎么能指示Maven执行我的unit testing,考虑作为类路径项目生成jar文件(以及任何其他声明的库依赖项)而不是默认情况下在文件系统中编译的类? 换句话说,现在我的unit testing的类路径设置为: /$PROJECTPATH/target/classes/ 。 相反,我希望将此类路径设置为:/ /$PROJECTPATH/target/myjarfile.jar 。 我已尝试手动添加和删除依赖项类,如下所述: http : //maven.apache.org/plugins/maven-surefire-plugin/examples/configuring-classpath.html ,但直到现在它还无法运行。 我目前的项目POM看起来像这样: 4.0.0 org.mygroupid myartifact 0.0.1-SNAPSHOT … org.apache.maven.plugins maven-compiler-plugin 2.1 1.7 1.7 org.apache.maven.plugins maven-source-plugin 2.1.2 attach-sources jar org.apache.maven.plugins maven-dependency-plugin 2.4 runtime ${project.build.directory}/lib copy-dependencies process-resources <!– package –> copy-dependencies org.apache.maven.plugins maven-surefire-plugin 2.12.3 ${project.build.outputDirectory} ${project.build.directory}/${project.build.finalName}.${project.packaging} 在此先感谢您的任何帮助!

在类路径中使用通配符调用java失败

我在当前目录中有一些jar,都需要在类路径中,所以我想使用classpath的通配符约定。 命令行是: java.exe -classpath * org.python.util.jython args 但是我收到了这个错误 Exception in thread “main” java.lang.NoClassDefFoundError: G:/repo/builds/jars/edu_mines_jtk/jar Caused by: java.lang.ClassNotFoundException: G:.repo.builds.jars.edu_mines_jtk.jar at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: G:/repo/builds/jars/edu_mines_jtk.jar. Program will exit. 如果我手动展开通配符,请使用 java.exe -classpath edu_mines_jtk.jar;ij.jar;jython.jar;more-jars org.python.util.jython [args] 然后它按预期工作。 我的通配符出了什么问题? Win7 […]

Javac vs Java in -classpath选项

从javac和java调用-classpath选项有什么区别 例如: javac -classpath MyJar.jar GetJar.java java -classpath MyJar.jar:. GetJar 它的工作原理如下: javac -classpath MyJar.jar GetJar.java java GetJar 所以基本上在与javac相关的第一个类路径需要在那里,另一方面在java命令行中它可能是可选的。 为什么? 你知道在什么情况下它是强制性的。 更一般地说, javac调用的-classpath的效果是什么, java调用的-classpath的效果是什么。 提前致谢。

覆盖MATLAB默认静态javaclasspath的最佳方法

MATLAB配置为在搜索用户可修改的动态路径之前搜索其静态java类路径。 不幸的是,静态路径包含相当多的非常旧的公共库,因此如果您尝试使用新版本,最终可能会加载错误的实现并获得错误。 例如,静态路径包含google-collections.jar的旧副本,该副本长期以来被Google的guava库取代,并且具有一些相同的类名(例如com.google.common.base.Objects)。 因此,如果你调用一个使用这种类之一的新方法的Guava方法,你最终会得到令人惊讶的NoSuchMethodErrors,因为首先找到了google-collections jar。 从R2012b开始,MATLAB允许您通过在首选项文件夹中放置javaclasspath.txt文件来指定要添加到静态路径的其他jar,但是将jar添加到路径的末尾,并且不允许您覆盖生成的jar进入MATLAB。 那么最好的解决方法是什么?

如何一次性包含CLASSPATH中特定目录中的所有jar?

我的应用程序使用的特定目录中有大约数百个jar子。 所以我认为很难将每个jar子逐个添加到类路径中。 那么有任何命令或任何方式,以便我可以一次性添加所有的jar子。 一些*.jar应该添加所有的jar子。

如何在hadoop文件系统上设置Java程序的类路径

我想弄清楚如何设置引用HDFS的类路径? 我找不到任何参考。 java -cp “how to reference to HDFS?” com.MyProgram 如果我不能引用hadoop文件系统,那么我必须在每个hadoop机器上的$ HADOOP_HOME下复制所有引用的第三方库/ jar …但我想通过将文件放到hadoop文件系统来避免这种情况。 这可能吗? 用于程序运行的示例hadoop命令行(我的期望是这样的,也许我错了): hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar -input inputfileDir -output outputfileDir -mapper /home/nanshi/myprog.java -reducer NONE -file /home/nanshi/myprog.java 但是,在上面的命令行中,我如何添加java classpath? 喜欢-cp“/home/nanshi/wiki/Lucene/lib/lucene-core-3.6.0.jar:/home/nanshi/Lucene/bin”

在Mac OS中将JAR添加到CLASSPATH

我正在尝试在Mac OS下设置CLASSPATH for Java。 具体来说,我正在尝试添加几个JAR存档。 如果我这样做: ## Setting up ASM bytecode instructor library export CLASSPATH=$CLASSPATH:/Users/fork/Dev/ASM/lib/all/asm-all-3.3.1.jar 它工作正常。 但是,如果我像文档建议那样设置它: ## Setting up ASM bytecode instructor library export CLASSPATH=$CLASSPATH:/Users/fork/Dev/ASM/lib/all/* 它似乎不起作用。 问题是我要添加,比方说10个jar子,一个一个地添加听起来是不切实际的。 有解决方案吗?