我有一个项目A,它包含一些java文件和一个类路径资源R.txt.在项目中我使用ClassLoader.getSystemResource("R.txt"); 检索R.txt.
然后我有一个项目B,其中包含项目A的jar文件.现在getSystemResource("R.txt")找不到文本文件(是的,它仍然在jar文件的根目录中).即使尝试在其他网站上建议的"/R.txt"也行不通.有任何想法吗?
我最近读了很多关于Java类加载过程的内容.我经常遇到这样的文本,声称在运行时期间无法在类路径中添加类并在没有类加载器hackery(URLClassLoaders等)的情况下加载它们.
据我所知,类是动态加载的.这意味着它们的字节码表示仅在需要时加载并转换为java.lang.Class对象.
所以,在JVM启动后,不应该可以在类路径中添加JAR或*.class文件并加载这些类,只要它们尚未加载?(要清楚:在这种情况下,类路径只是文件系统上的文件夹."添加JAR或*.class文件"只是意味着将它们放在这个文件夹中.)
如果没有,这是否意味着在JVM启动时搜索类路径,并且找到的类的所有完全限定名称都缓存在内部"列表"中?
如果你能指出我的答案中的一些消息来源,你会很高兴.最好的SUN文档:Sun JVM Spec.我已阅读规范,但无法找到有关类路径的任何内容,以及它是否已在JVM启动时完成.
PS
这是一个理论问题.我只想知道是否有可能.我想实现没有任何实际意义.只有我对知识的渴望:)
我试图在Windows7上使用java连接到mysql数据库.尽管在CLASSPATH中添加了jdbcdriver jar文件的完整url,但抛出了java.lang.ClassNotFoundException:com.mysql.jdbc.Driver.谁能告诉我我在这里失踪了什么?如果我在项目库中添加jar文件但是我想通过CLASSPATH本身来实现它.我的类路径看起来像这样 - C:\ jython2.5.1\javalib\mysql-connector-java-5.1.12-bin.jar
我想说清楚这不是我正在进行的实际项目.我实际上正在使用Django和Jython,它需要JDBC驱动程序来访问数据库.这就是为什么我必须只使用CLASSPATH.
下载最新的.tar文件后,我跑去tar zxvf jdk-7u45-linux-x64.tar.gz提取java文件.
在.bashrcfile(vi ~/.bashrc)中设置路径如下;
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45/bin/java
export PATH=$PATH:/usr/lib/jvm/jdk1.7.0_45/bin
export JDK_HOME=/usr/lib/jvm/jdk1.7.0_45
export JRE_HOME=/usr/lib/jvm/jre1.7.0_45
Run Code Online (Sandbox Code Playgroud)
现在,运行命令java -version或者哪个java,java PATH仍然指向较旧的java版本(java version "1.6.0_27").
我知道默认的ubuntu采用OpenJDK路径.我必须将路径更改为最新版本,作为我在.bashrc文件中设置的系统环境变量.
也, sudo update-alternatives --config java
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 auto mode
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-7-oracle/jre/bin/java 1062 manual mode
* 3 /usr/lib/jvm/jdk1.7.0_45/bin/java 1 manual mode
Press enter to keep the current choice[*], or type selection number: 3
Run Code Online (Sandbox Code Playgroud) 我有一个Tomcat应用程序,需要引用应用程序外部的一些属性文件.通常这些存储在特定地方的本地机器上C:\PROJECT_NAME\conf\.
在Tomcat 7中,这可以通过放置一个context.xml文件来实现,/META-INF/其中使用了一个VirtualWebappLoader实际上将此位置添加到应用程序类路径的文件,如下所示:
<Context>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/PROJECT_NAME/conf"
searchVirtualFirst="true" />
</Context>
Run Code Online (Sandbox Code Playgroud)
如何在Tomcat 8中实现同样的功能?
使用这个简单的例子,我遇到了"ClassNotFound"异常的问题:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import java.net.URLClassLoader
import scala.util.Marshal
class ClassToRoundTrip(val id: Int) extends scala.Serializable {
}
object RoundTripTester {
def test(id : Int) : ClassToRoundTrip = {
// Get the current classpath and output. Can we see simpleapp jar?
val cl = ClassLoader.getSystemClassLoader
val urls = cl.asInstanceOf[URLClassLoader].getURLs
urls.foreach(url => println("Executor classpath is:" + url.getFile))
// Simply instantiating an instance of object and using it works fine.
val testObj = new ClassToRoundTrip(id)
println("testObj.id: " + testObj.id)
val testObjBytes …Run Code Online (Sandbox Code Playgroud) 所以我一直在尝试使用信号收集框架,我下载了.jar文件并将其解压缩到一个文件夹中.目前文件夹结构如下:
LICENSE.txt
PageRank.scala
core-1.1.1-sources.jar
dependencies/
javaapi-1.1.1-sources.jar
NOTICE.txt
README.txt
core-1.1.1.jar
javaapi-1.1.1-javadoc.jar
javaapi-1.1.1.jar
Run Code Online (Sandbox Code Playgroud)
PageRank.scala他们提供的Scala测试代码在哪里,即:
import com.signalcollect._
object PageRank extends App {
val graph = GraphBuilder.build
graph.addVertex(new PageRankVertex(id=1))
graph.addVertex(new PageRankVertex(id=2))
graph.addEdge(new PageRankEdge(sourceId=1, targetId=2))
graph.addEdge(new PageRankEdge(sourceId=2, targetId=1))
graph.execute
graph.foreachVertex(println(_))
graph.shutdown
}
class PageRankVertex(id: Any, dampingFactor: Double=0.85)
extends DataGraphVertex(id=id, state=1-dampingFactor) {
type Signal = Double
def collect(oldState: Double, mostRecentSignals: Iterable[Double]): Double = {
1 - dampingFactor + dampingFactor * mostRecentSignals.sum
}
}
class PageRankEdge(sourceId: Any, targetId: Any)
extends DefaultEdge(sourceId, targetId) …Run Code Online (Sandbox Code Playgroud) 是否可以使用-classpath选项java,添加或替换CLASSPATHenv变量的内容?
当我在Eclipse中时,我的项目编译时没有错误,但是当我尝试使用javac它进行编译时说我错过了一些包...
我复制了我的编译命令和下面的一些错误文本:
javac -classpath lib/ -d bin/ src/*.java
src/Cleaner.java:5: package net.sourceforge.jgeocoder does not exist
src/MyUtilities.java:19: package org.apache.commons.codec.binary does not exist
Run Code Online (Sandbox Code Playgroud)
在Eclipse中,我已将所有.JAR文件添加到构建路径中,并且程序编译得很好.
当我使用javac而不是Eclipse IDE时,为什么它找不到罐子?
我希望使用java代码动态地将jar文件添加到我的项目的类路径中,如果可能的话,我想使用外部jar文件并加载它们的类,将它们作为Beans稍后执行(Spring框架).
谢谢 :)
classpath ×10
java ×8
jar ×3
jvm ×2
scala ×2
apache-spark ×1
classloader ×1
eclipse ×1
resources ×1
spring ×1
tomcat ×1
tomcat8 ×1
ubuntu-10.04 ×1