我一直在使用这么多的第三方库(jar文件),我的CLASSPATH完全搞砸了,因为我必须包含我使用的每个jar文件的路径.
我一直想知道是否有办法使用通配符(*)运算符(如*.jar)将所有jar文件包含在文件夹中.但似乎没有用.有没有其他方法可以缩短当前看起来像文章的CLASSPATH;)在我的电脑上?
我这几天正在学习Java,我花了很多时间在.NET上,所以当我想导出或导入库时,它们通常是.dll格式,在.Net环境中称为汇编,它们被编译为IL他们可以通过任何方式拥有图像,xml,音频和儿子等资源.
我也想知道Java中的相同过程.我已经阅读了文档,但他们实际上让我感到困惑,并澄清了我需要你帮助的人.
问题:
他们说资源,我们在这里谈论什么样的资源?图像,.txt文件等等或所有这些都可能吗?
我已经检查了AWS(适用于Java的Amazon Web Service API),我看到了三个.jar文件
它们包含.class文件 - html格式的java文档和仍未编译的.java文件.所以我意识到.jar不仅包括编译的字节代码(.class)以及其他内容.
提前感谢您的帮助.
我有一个Maven项目,它生成一个jar文件并将所有依赖项复制到target/lib文件夹.我想在客户端的机器(windows)上执行这个项目.所以,我复制myproject.jar到C:\xyz文件夹和所有依赖项到C:\xyz\lib文件夹.如何从客户端的命令提示符执行此项目?我试图java -cp lib\*.jar -jar myproject.jar从C:\xyz文件夹使用,但它抛出以下错误.
Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.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: lib\commons-codec-1.3.jar. Program will exit.
Run Code Online (Sandbox Code Playgroud)
我想如果我在classpath(如java -cp lib\dep1.jar;dep2.jar)中指定所有依赖项,它将解决问题,但我不想这样做,因为我已经有40个库,并且它可能会在将来的版本中增长.有一个更好的方法吗?
从命令行,如何将Java CLASSPATH选项设置为指向包含多个jar文件的一个或多个目录?是否存在递归目录和子目录支持的通配符?
(我的JAR文件在几个子目录中排序.)
我试图在jar外面的文件系统上运行带有log4j.xml文件的jar,如下所示:
java -jar MyJarName.jar -cp=/opt/companyName/pathToJar/ log4j.configuration=log4j.xml argToJar1 argToJar2
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
java -jar MyJarName.jar -cp=/opt/companyName/pathToJar/ log4j.configuration=/opt/companyName/pathToJar/log4j.xml argToJar1 argToJar2
Run Code Online (Sandbox Code Playgroud)
log4j.xml文件与jar(/ opt/companyName/pathToJar /)位于同一目录中,但我仍然收到标准警告消息:
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
Run Code Online (Sandbox Code Playgroud)
是否可以将配置文件放在jar外面,或者我是否必须将它与jar打包?
TIA
从我的读数来看,执行命令时如下:
java -jar foo.jar
Run Code Online (Sandbox Code Playgroud)
然后忽略主类路径,并从清单文件中获取类路径.
此外,还会忽略在命令行上声明的类路径.所以在:
java -classpath /usr/local/jar/foobar.jar -jar foo.jar
Run Code Online (Sandbox Code Playgroud)
/usr/local/jar/foobar.jar被忽略.
最后,我已经读过清单文件只能在jar文件中包含相对路径.
那么,如何包含系统中存在的外部jar的绝对路径,而不是正在执行的jar文件中?
我的应用程序使用的特定目录中有数百个罐子.所以我认为很难将每个罐子逐个添加到类路径中.所以有任何命令或任何方式,以便我可以一次性添加所有的罐子.有些人*.jar应该添加所有的罐子.
所以我一直在尝试使用信号收集框架,我下载了.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) 这个东西不断出现我检查了我的所有源文件都是utf8编码,我使用'-encoding UTF8'标志与scalac和scala命令行工具有
什么想法?
谢谢
我在Windows上观察到Java7的通配符扩展行为的奇怪行为.
几个世纪以来,"*"与*之间存在着明显的差异.
似乎这对Java7来说不再适用(至少在Windows7上).
我在使用通配符类路径时注意到了这个问题.
尽管引用了wildcard-classpath,它仍然会被扩展.
因此,似乎不可能再将通配符传递给java应用程序.
因此使用java -cp "somewhere/*"将失败(如同"somewhere\*").
一种解决方法似乎是:java -cp "somewhere/*;"它抑制了扩张.
为了验证行为,我写了一个小的Echo.java类.
我发现使用java 1.6.0引用"*"和plain*就像预期的那样工作,而在Java7上我总是得到扩展的通配符.到目前为止,这在Windows7上被观察到,不知道XP上会发生什么.
问题出现了,因为Windows上的通配符永远不会被黑暗时代CMD.EXE扩展(就像UNIX上的任何shell一样).相反,每个可执行文件都必须使用setargv.obj显式执行此操作.
我发现了两个似乎描述类似问题的相关问题:
这是否被其他人观察到了?
或者是否有一些模糊的Windows或批处理文件设置来控制它?
迪特.