Java 编译时如何使用通配符包含JAR文件?

Java 编译时如何使用通配符包含JAR文件?,java,jar,compilation,packages,Java,Jar,Compilation,Packages,java文件(MyRtmpClient.java)中包含以下内容: 而ByteBuffer位于一个JAR文件中(当然具有正确的目录结构)。 该jar文件和我需要的其他文件与.java文件位于同一目录中 然后我用以下行编译: javac -cp ".;*.jar" MyRtmpClient.java 但我得到了一个错误: MyRtmpClient.java:3:package org.apache.mina.common不存在 导入org.apache.mina.common.ByteBuffe

java文件(MyRtmpClient.java)中包含以下内容:

ByteBuffer
位于一个JAR文件中(当然具有正确的目录结构)。 该jar文件和我需要的其他文件与.java文件位于同一目录中

然后我用以下行编译:

javac -cp ".;*.jar" MyRtmpClient.java
但我得到了一个错误:

MyRtmpClient.java:3:package org.apache.mina.common不存在
导入org.apache.mina.common.ByteBuffer


如何在项目中包含jar文件?

尝试在命令行中包含jar文件,以便:


javac MyRtmpClient.java ByteBuffer.jar

javac不理解classpath参数中的*.jar。您需要显式地指定每个jar。e、 g

javac -cp ".;mina.jar" MyRtmpClient.java

您的命令行是正确的,但有一些注意事项:

  • 您必须将javac>=1.6,因为只有在该版本中,编译器才会将“*”解析为各种JAR文件
  • 您必须运行Windows,因为“;”仅是该操作系统的路径分隔符(它在Unix上不起作用,Unix上的路径分隔符是“:”)

我假设JAR文件具有您所述的正确目录结构。

在您的情况下,我认为JAVAC找不到JAR文件

请尝试:

项目路径
-lib\a.jar
-src\package\b.java

cd @PROJECT_PATH

javac -classpath lib\a.jar src\package\b.java

您不能将
-cp
与Javac一起使用。您必须改用
-classpath
(假设其他设置正确)。

下面的语法可能适用于windows dos命令

javac -cp ".;first.jar;second.jar;third.jar" MyRtmpClient.java

如果您有可用的实用工具
find
tr
(例如,您正在使用Linux),您可以执行以下操作:

javac -cp .:`find * -name "*.jar" | tr "\n" ":"` MyRtmpClient.java
将添加当前目录及其所有子目录中的所有jar文件(shell命令列出所有jar文件,并将冒号作为分隔符放在它们之间)。
说明:

  • 一对反勾号(`)表示要执行的shell命令
  • find*-name“*.jar”
    查找并列出层次结构中根目录为当前文件夹的所有jar文件
  • 竖条(|)是管道;将
    find
    的输出连接到下一个命令的输入
  • tr“\n”:“
    用冒号字符替换所有换行符

    • 在javacjdk6及更高版本中,您可以使用(注意缺少.jar):

      引用

      为方便起见,包含basename*的类路径元素被认为等同于指定目录中所有文件的列表,扩展名为.jar或.jar

      例如,如果目录foo包含a.jar和b.jar,那么类路径元素foo/*将扩展为a.jar;b、 JAR,只是JAR文件的顺序未指定。列表中包括指定目录中的所有jar文件,甚至是隐藏的文件。仅由*组成的类路径项扩展为当前目录中所有jar文件的列表

      在Java8中,上面提到的“;*”等选项似乎不起作用。我试着发现:
      javac-cp'/*'MyRtmpClient.java

      作品:


      可以是/usr/local/classes/*或/home/developer/MyProject/*

      不,绝对不是。“用法:javac”我会试试。但是有很多。我不喜欢被迫一个接一个地包含所有jar文件的想法。是的,*通常由shell解释,但在这里没有机会。我在编写答案之前尝试在Linux上使用*.jar,但没有成功。取决于JDK版本;如上所述。因此,如果我删除引号,它似乎理解-cp.jar,但它不理解-cp.:.jarI发现它不支持*.jar,但它将支持*。这是用引号括起来的,这样命令行就不会改变它们,真的吗?我不知道它会解析*。我想我已经有一段时间没有从命令行编译任何需要类路径的东西了。你的可能就是我进退两难的答案。我有JDK 1.5:(这是源代码:除非类路径中有空格,否则不需要引号。在本例中,使用“javac-cp...\lib\**src\package\b”。该规则将匹配lib下的JAR以及当前目录中的通配符类。
      javac -cp .:`find * -name "*.jar" | tr "\n" ":"` MyRtmpClient.java
      
      javac -cp ".;*" MyRtmpClient.java