我的Java类组织变得有点乱,所以我正在讨论我在Java学习中跳过的东西:类路径.我无法安静地得到心爱的类来编译我为他们创建的包.这是我的文件夹层次结构:
.
com/
david/
Greet.java
greeter/
SayHello.java
SayGoodbye.java
Run Code Online (Sandbox Code Playgroud)
SayHello的构造函数只打印"hello"和SayGoodbye的打印"Goodbye",而Greet的main方法只创建了这两个对象.在SayHello的顶部是包com.david.greeter; 与SayGoodbye和Greet相同的是包com.david;
在greeter文件夹中,我能够编译两个java文件但是如果我转到当前目录(保存com的目录)并执行javac -cp"com.david.greeter.*"com/david/Greet.java它说它找不到类以及说包com.david.greeter不存在.我也试过手动设置$ CLASSPATH.
我在这里结束了,Stackoverflow(正如我在这里发布的那样).你们中的任何人都知道我做错了什么吗?
我有以下代码
package myPackage;
import org.neo4j.graphdb;
import org.neo4j.kernel.EmbeddedGraphDatabase;
public class dbServlet extends HttpServlet {
public void init() throws ServletException {
// Start up the database here
GraphDatabaseService graphDb = new EmbeddedGraphDatabase("var/base");
}
public void destroy() {
graphDb.shutdown();
}
Run Code Online (Sandbox Code Playgroud)
和 build.xml 文件:
<project name="dbServlet" basedir="." default="compile">
<property name="src.dir" value="src"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
</target>
</project> …Run Code Online (Sandbox Code Playgroud) 我正在尝试将属性文件动态添加到类路径,如下所示
try {
File fileToAdd = new File(FILE_PATH);
URL u = fileToAdd.toURL();
ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
if (sysLoader instanceof URLClassLoader) {
sysLoader = (URLClassLoader) sysLoader;
Class<URLClassLoader> sysLoaderClass = URLClassLoader.class;
// use reflection to invoke the private addURL method
Method method = sysLoaderClass.getDeclaredMethod("addURL",
new Class[] { URL.class });
method.setAccessible(true);
method.invoke(sysLoader, new Object[] { u });
}
} catch (Exception e) {
logger.error(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
但是我在类路径中看不到该文件。当我使用检查
System.getProperty("java.class.path")
Run Code Online (Sandbox Code Playgroud)
我在此列表中看不到我的文件。我在这里想念什么吗?
在gradle中,有没有办法引用外部罐子.我有一些外部罐子,坐在项目结构外的另一个文件夹中.有没有办法在build.gradle文件中添加对这些jar的引用,以便在编译过程中获取它们?
谢谢
编辑:
我使用allprojects任务修改了mu build.gradle,该任务具有以下"子任务(?)",如下所示:
repositories{
flatDir name:'ExternalJars',dirs:'<path to the jars>'
dependencies{
compile: 'jarname:jarname:version'
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎使我的构建运行得很好.当我创建存储库并指定依赖项时,是否有人可以了解到底发生了什么?- 谢谢
我有一个products.jar文件.里面有一个班级com.ClassA.项目的结构就像
products
|--test
|--com
|--ClassA.java
|--dependencies
|---inputs.txt
Run Code Online (Sandbox Code Playgroud)
在Eclipse中,通过以下路径ClassA.java访问inputs.txt文件,它工作正常
private static final String PROPERTIES_FILE_PATH = "test/dependencies/inputs.txt";
Run Code Online (Sandbox Code Playgroud)
test package是在java构建路径 - > sources中
但是当我导出这个项目时products.jar,我发现在jar文件中没有test目录.有两种显示目录com和dependencies在JAR文件的根目录.因此,当我尝试ClassA通过命令行执行(驻留在jar文件中)时,我收到以下异常:
JUnit version 4.8.2
java.io.FileNotFoundException: test/dependencies/inputs.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:137)
at java.io.FileInputStream.<init>(FileInputStream.java:96)
Run Code Online (Sandbox Code Playgroud)
因此,在发现test未在jar文件中导出dir 后,我将ClassA.java中文件的路径更改为dependencies/inputs.txt.它在eclipse中不起作用,但我认为它可以在jar中工作,因为jar文件在classpath中,dependencies文件夹在jar文件的根目录下,所以java启动器将能够找到dependencies文件夹然后inputs.txt文件.
但不幸的是它也没有用.
如何使依赖库的源在编译时在类路径中可用?
我正在使用 IntelliJ IDEA 11。
当我将全局库添加到模块和工件时,IDE 永远不会复制源代码和 javadoc。这是有道理的,因为它们在运行时不需要。但是我在编译时需要它们。
有趣的是,如果我将依赖项添加为文件夹,IDEA会提供源代码。我想在这种情况下,它不会区分该文件夹中的内容。奇怪的。
想法?
我试图找出一个与可执行jar文件有关的奇怪问题:xyz.jar在清单文件中有一个类路径/并且依赖于abc.jar库.
不幸的是,xyz.jar中的清单类路径不正确.为了避免灾难,我正在更新要使用的执行命令:java -classpath path/abc.jar:etc而不是java -jar
问题是xyz.jar故障,除非abc.jar不在类路径上.当删除abc.jar时,程序正确执行,并且不会抛出任何异常.为什么?xyz.jar必须从其他地方拿起abc.jar.xyz.jar调用abc.jar中的方法.
-classpath应覆盖任何$ CLASSPATH设置.即使使用-classpath,java仍然可以查看清单类路径吗?
我在我的项目中实现这个逻辑时遇到问题。我正在使用 ServiceLoader,我不知道或者它是否可能,但我想将 JAR 动态添加到应用程序的某个已知目录中,以便应用程序可以在启动时加载它们。我唯一取得的成就是我知道如何创建可扩展的 ONE JAR(使用 META-INF/服务),因此我可以向这个 JAR 添加越来越多的提供者和类(实现)。JAR 像普通库一样包含在类路径中,因此应用程序知道它。我想要实现的目标:我不想扩展一个 jar 文件,但我想通过添加更多 jar 来扩展应用程序,例如带有提供程序(服务)的插件,但我不知道如何。
感谢帮助!
将简单的Web应用程序项目转换为maven项目后,是否可以将项目.classpath文件转换为pom.xml?因为如果我的项目使用了很多jar并且我想将它转换为maven,那么我将配置 - >转换为maven但是然后无法手动在pom.xml中添加所有jars依赖项.那么有没有任何工具来转换它.
我的应用程序中有以下代码块;
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(FilePath);
Run Code Online (Sandbox Code Playgroud)
这里'FilePath'是文件的绝对路径.
当我在正常模式下运行应用程序时,上面的代码在linux和windows中工作正常.(即:在命令提示符下)但是当我将应用程序作为Windows服务运行时,这不起作用.我将输入流作为'null'.
有人遇到过这样的问题吗?除了java类加载器之外,我找不到任何关于此的信息.这里我们使用"ContextClassLoader",它是正确使用的类加载器.
这有什么线索吗?