精华内容
下载资源
问答
  • 遇到java 文件编译问题

    千次阅读 2018-02-04 10:18:36
    1.今天在开发中遇到我的classpath下的properties文件编译问题,因此进行了手动编译,将我们文件拷贝到classes路径下,其实便宜一个文件对我们来说so easy,但是这个编译文件是一个servlet文件,直接编译会不成功,...

    在开发中有时我们会遇到在我们IDE改写文件之后不编译问题,那么怎么处理,这是我的处理方式。

    1.今天在开发中遇到我的classpath下的properties文件不编译问题,因此进行了手动编译,将我们文件拷贝到classes路径下,其实便宜一个文件对我们来说so easy,但是这个编译文件是一个servlet文件,直接编译会不成功,因为我们jdk没有servlet-api.jar,所以我们需要将tomcat lib中servlet-api.jar放入到我们jdk 中D:\javasoft\jdk1.7.0_45\jre\lib\ext路径下(这也是classpath),我们在执行javac -d . *.java此时可以正常编译成功,over!

    展开全文
  • Smali反编译Java文件

    万次阅读 2016-04-27 00:24:26
    我们在开发 安卓中,有时需要对其他apk文件进行编译,以便我们方便进行学习交流研究使用。...我们怎么对他进行反编译Java文件,并让我们看懂呢?下面进行一下简单介绍:使用的到工具: smali.jar

    我们在开发 安卓中,有时需要对其他apk文件进行反编译,以便我们方便进行学习交流研究使用。

    我们使用 Android SDK 默认生成的工程会自动添加一些类到我们的工程中。这些类在程序发布后会仍然保留在apk 文件中。

    我们对其进行反编译后 可以发现 会有Smali后缀名的文件。我们怎么对他进行反编译城Java文件,并让我们看懂呢?下面进行一下简单介绍:

    使用的到工具:
    smali.jar, ApkToolKit工具,jd-gui工具(文下附下载链接):

    首先我们找到我们的activity.smali和smali.jar文件(activity.smali文件):这里写图片描述

    打开cmd:执行命令:
    C:\Users\Administrator>java -jar C:\Users\Administrator\Desktop\smali.jar -o cle
    sses.dex C:\Users\Administrator\Desktop\activity.smali

    这里写图片描述

    生成clesses.dex文件:
    这里写图片描述

    将文件 拖入:ApkToolKit中:
    这里写图片描述

    点击dex转jar 这时会生成一个jar文件:
    这里写图片描述

    打开jd-gui:

    将我们生成的jar文件拖拽过去:

    效果如图:
    就会产生我们可以看得懂的Java代码了:
    这里写图片描述

    这样整个转换过程就完成了。

    软件下载链接:
    http://download.csdn.net/detail/u013233097/9503683

    展开全文
  • 在 Eclipse 上把 jmeter 源码编译了,现在想要自定义的 java 脚本 debug 调试。 原来的方法是把自定义的脚本...现在在 Eclipse 编译下不能使用,那现在该怎么创建自定义的 java 测试脚本,通过 Eclipse 进行调试?
  • 习惯了eclipse的自动编译Java命令行编译、执行文件只会最基础的部分,就是文件编译和执行,而且不包含任何外部JAR包。但有时候你还非得用命令行,会碰到一些问题,博主这里给出几种常见的问题及解决方法。 ...

    Java命令行编译文件时出现的错误,找不到符号或软件包不存在等

    标签(空格分隔): Java


    参考http://stackoverflow.com/questions/6665420/package-does-not-exist-error
    参考http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

    配套代码上传在http://download.csdn.net/detail/qq369201191/9287185

    习惯了eclipse的自动编译,Java命令行编译、执行文件只会最基础的部分,就是对单文件的编译和执行,而且不包含任何外部JAR包。但有时候你还非得用命令行,会碰到一些问题,博主这里给出几种常见的问题及解决方法。

    实验环境介绍

    这里写图片描述
    eclipse 的工作目录在D:\myeclipse\Workspaces,里面有我们的一个工程example,点进去,eclipse为我们设置好的几个文件.settingsbinsrc.classpathproject,src中存放的是源代码,结构就如上图所示。

    在eclipse导入后显示的结构如下图所示,
    这里写图片描述
    小提示:包名com.example.controller指的是在src/com/example/controller文件夹下有个controller.java文件

    model.java是一个独立的类,不导入任何外部包
    controller.java导入了com.example.model.model
    view.java导入了com.example.controller.controller和调用了一个外部Jar包

    在观察案例代码时,需要特别注意此时命令行的当前目录选项参数Java文件,会有不同的结果

    使用绝对路径

    绝对路径就是从根目录开始的路径,Windows下就是以盘符开头,如”C:\”,Linux下以斜杠开头/home。

    使用绝对路径的好处就是不管命令行的当前路径在哪里,都能正确的进行编译

    案例一

    D:\myeclipse\Workspaces\example>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java

    案例二

    D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java

    使用相对路径

    • 相对路径就是相对当前上下文环境,在命令行中就是相对命令行中前面的路径。
    • 相对路径不以/开头,直接文件名。

    如案例一,当前路径在D:\myeclipse\Workspaces\example\src,相对这个路径,Java文件的相对路径就为com/example/model/*.java。在案例二中当前路径有变化,相应得Java文件的相对路径也有变化。

    案例一

    D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java

    案例二

    D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java

    基本概念已经理解了,上干货,一般命令行编译出现的问题:

    问题一:找不到符号或软件包不存在

    案例一

    D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java

    这种情况下可以正常得进行编译,因为你自己不指定classpath,一般系统默认的classpath会在当前路径中搜索。

    案例二

    D:\myeclipse\Workspaces\example>javac src/com/example/controller/*.java
    
    报错
    src\com\example\controller\controller.java:3: 软件包 com.example.model 不存在

    我们切换目录,已上文绝对路径、相对路径的知识,正确给出Java文件的路径。这时会报出错误,软件包com.xxx不存在。因为在controller.java文件中有一个import com.example.model.model,根据系统默认的classpath会在当前路径下找,即D:\myeclipse\Workspaces\example,很明显这个路径下没有com文件。

    解决方法,我们告诉编译器哪个目录下会有就行了,所以需要加入选项-cp xxxx 或 -classpath xxxx

    D:\myeclipse\Workspaces\example>javac -cp src src/com/example/controller/*.java

    加上参数-cp src,告诉编译器可以去src中找,就不会有问题了。

    同样的,classpath可以是相对路径,也可以是绝对路径,本例中使用的是相对路径,命令行换路径后,所有参数都要换

    D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java

    下面这个是用绝对路径写的,相对路径和绝对路径以下不再叙述

    javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java

    问题二:JAR包怎么引入

    首先还是在eclipse调通,建议专门建立一个lib文件,然后把JAR包全部放在这里面,对项目转移也比较方便。

    案例一

    D:\myeclipse\Workspaces\example\src>javac com/example/view/view.java
    
    错误
    com\example\view\view.java:4: 软件包 com.google.gson 不存在
    import com.google.gson.Gson;
                          ^
    com\example\view\view.java:14: 找不到符号
    符号: 类 Gson
    位置: 类 com.example.view.view
                    Gson gson = new Gson();
                    ^
    com\example\view\view.java:14: 找不到符号
    符号: 类 Gson
    位置: 类 com.example.view.view
                    Gson gson = new Gson();
                                    ^
    3 错误

    其实就一个问题,没找到JAR包。引入JAR就是注意要把路径写到JAR包的具体位置。废话少说,给出例子:

    案例二

    D:\myeclipse\Workspaces\example\src>javac -cp lib/gson-2.3.1.jar com/example/view/view.java
    
    错误
    com\example\view\view.java:3: 软件包 com.example.controller 不存在
    import com.example.controller.controller;
                                 ^
    com\example\view\view.java:10: 找不到符号
    符号: 类 controller
    位置: 类 com.example.view.view
                    new controller();
                        ^
    2 错误

    细心的你会发现,问题变了,因为我们引入了JAR包,所以因为JAR找不到的GSON问题已经没了,现在的问题就是找不到com.xxxx,就变成问题一。这里解释一下,我们加入-cp xxxx或-classpath xxxx之后,会覆盖系统中的classpath,案例二这么写的确可以找到GSON类,但在碰到import com.example.model.model时还在lib/gson-2.3.1.jar文件中查当然是找不到了,所以报错。方法很简单,在增加一个com.xxxx文件夹的路径,没错就是当前路径。所以加上.;lib/gson-2.3.1.jar。现在你是否对一开始配置Java环境时候,classpath中的路径要.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar有了理解呢?

    特别注意的是在Linux下用冒号:进行分隔,而在Windows用分号进行分割。

    案例三

    正确
    D:\myeclipse\Workspaces\example\src>javac -cp .;lib/gson-2.3.1.jar com/example/view/view.java

    问题三:指定class文件存放位置

    默认的情况下,class文件和java文件存放在一个目录下,但你有没有发现,eclipse编译后会有两个目录,一个是src,存放的是用户编辑的源代码,定一个是bin文件,是编译后的字节码。它是加了-d选项。

    D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java

    这里bin文件和src文件是同级(看实验环境介绍),也是使用的是相对路径。打开文件后可以发现在bin文件中生成了com/example/model/model.class具有层次结构的目录。

    到此我相信你已经能基本上解决编译时的问题了。

    总结

    本文给出了几个常见问题的解决方案,以上代码都经过实验过,不会有问题。命令行中我们要注意相对路径和绝对路径的差别,已经Linux下和Windows下分隔符的差别(Linux用冒号,Windows下用分号)。另外设置classpath时,一般都加上当前路径.。

    以上内容是博主查阅一些资料,并进行了总结,本来还想认真研读一下官方文档的,但因为是全英文,而且很具体,还是放弃了。以后在碰到问题继续完善好了。如果以上所述有问题,请及时指出,欢迎交流!

    展开全文
  • 在前文 源码编译 中一文中我们介绍了关于源码的...最近看到有不少大佬测试用例进行编译,有所启发,我分析了测试用例的Makefile和java2jar的内容,有一点新的收获,在此做简要的分享。java2jar其实本身是一个很...

    在前文 源码编译 中一文中我们介绍了关于源码的编译,随后在 可执行文件简介 对方舟工具链的几个工具的执行情况进行了简单的验证。但是,我只是在out/bin的目录下直接进行验证,并未结合samples目录的测试用例进行验证。最近看到有不少大佬对测试用例进行编译,有所启发,我分析了测试用例的Makefile和java2jar的内容,有一点新的收获,在此做简要的分享。

    java2jar其实本身是一个很简单的小脚本工具,要做的就是将Java文件编译成class文件之后,然后进行打包。但是根据 可执行文件简介 的内容,其运行存在一定的问题,虽然做了一些修改,但是还存在一些问题。我们先看java2jar的源码:

    #!/bin/bash
    OUTPUT=$1
    CORE_ALL_JAR=$2
    shift 2
    javac -g -d . -bootclasspath ${CORE_ALL_JAR} $@
    jar -cvf ${OUTPUT} *.class                                                                         

    其中涉及到两个输入,$1和$2。$1是要输出的jar包,$2是要输入一个叫CORE_ALL_JAR。之前我也尝试了各种对于java2jar的输入,不得其要领,看到大佬们构建测试用例,才想到从测试用例的Makefile借鉴方舟的工具链使用。所以查看samples/helloworld/Makefile:

    APP = HelloWorld
    include $(MAPLE_BUILD_CORE)/maple_test.mk

    而进一步查看build/core/maple_test.mk:

    include $(MAPLE_BUILD_CORE)/maple_variables.mk
    
    test: $(APP_S)
    include $(MAPLE_BUILD_CORE)/mplcomb.mk
    include $(MAPLE_BUILD_CORE)/jbc2mpl.mk
    include $(MAPLE_BUILD_CORE)/java2jar.mk
    
    .PHONY: clean
    clean:
    	@rm -rf *.jar
    	@rm -f *.class
    	@rm -f *.mpl
    	@rm -f *.mplt
    	@rm -f *.s
    	@rm -f *.groots.txt
    	@rm -f *.primordials.txt
    	@rm -rf comb.log

    这里面又包含了mpcomb.mk、jbc2mpl.mk、java2jar.mk这三个文件。我们先查看java2jar.mk,因为前文也分析过,它是工具链的第一个环节,具体源码为:

    $(APP_JAR): %.jar : %.java
    	$(JAVA2JAR) $(APP_JAR) ${MAPLE_ROOT}/libjava-core/java-core.jar "$(wildcard *.java)"

    我们看到,这里在输入java文件之前,输入了一个java-core.jar包,这个包就是前面java2jar中的CORE_ALL_JAR。这个包在这次发布的时候并没有提供,这也是不少同仁都验证发现的问题。这个才是导致之前关于java2jar总不能达到预期的结果。

    那么我们继续看看jbc2mpl.mk,以查看jbc2mpl是怎么具体使用的,其具体源码为:

    $(APP_MPL): %.mpl : %.jar $(JBC2MPL_BIN)
    	$(JBC2MPL_BIN) --mplt $(LIB_MPLT) -injar $(APP_JAR) -out $(APP)

    这里也要求输入一个LIB_MPLT文件,也就是一个mplt的格式的库。发布中没有发现相关的mplt库,所以这个库的缺失是我们之前jbc2mpl总是失败的原因。所以,从我们目前能看到,缺失了一个java-core.jar以及一个mplt库(方舟的中间格式之一),导致第一步骤和第二步骤都无法运行。所以,也没办法继续运行后两个可执行文件maple和mplcg。

    而maple和mplcg的两个可执行文件的运行方式,也可以从Makefile中看到一些信息。mplcomb.mk:

    $(APP_S): %.VtableImpl.s : %.mpl $(MAPLE_BIN) $(MPLCG_BIN)
    	$(MAPLE_BIN) --infile $< $(MPLCOMBO_FLAGS) --save-temps

    maple_variables.mk

    TARGETS := $(APP)
    LIB_MPLT := $(MAPLE_ROOT)/libjava-core/libjava-core.mplt
    APP_CLASS := $(foreach APP, $(TARGETS), $(APP).class)
    APP_JAR := $(foreach APP, $(TARGETS), $(APP).jar)
    APP_MPL := $(foreach APP, $(TARGETS), $(APP).mpl)
    APP_MPLT:=$(foreach APP, $(TARGETS), $(APP).mplt)
    APP_VTABLEIMPL_MPL := $(foreach APP, $(TARGETS), $(APP).VtableImpl.mpl)
    APP_S := $(foreach APP, $(TARGETS), $(APP).VtableImpl.s)
    
    JAVA2JAR := $(MAPLE_ROOT)/out/bin/java2jar
    JBC2MPL_BIN := $(MAPLE_ROOT)/out/bin/jbc2mpl
    MAPLE_BIN := $(MAPLE_ROOT)/out/bin/maple
    MPLCG_BIN := $(MAPLE_ROOT)/out/bin/mplcg
    MPLME_FLAGS := --quiet
    MPL2MPL_FLAGS := --quiet --regnativefunc --maplelinker
    MPLCG_SO_FLAGS := --fpic
    MPLCG_FLAGS := --quiet --no-pie --verbose-asm --maplelinker
    MPLCOMBO_FLAGS := --run=me:mpl2mpl:mplcg --option="$(MPLME_FLAGS):$(MPL2MPL_FLAGS):$(MPLCG_FLAGS) $(MPLCG_SO_FLAGS)"

    从这个里面,我们可以看到maple和mplcg两个可执行文件,是放到一个阶段执行的。我们总结起来,可以分为三个阶段:1、java2jar;2、jbc2mpl;3、maple和mplcg。

    前两个阶段第一个阶段需要一个额外的java-core.jar包,第二个阶段需要一个额外的mplt格式的库。综合分析起来,有点诡异,其实从测试用例的角度来看,我们就缺少一个运行时的库。所以,java-core.jar包可能就是这个库。在这种推论下,那么java2jar添加这个库之后,我们后续的信息应该已经完整了。那么在第二个阶段还缺一个mplt的库,这有点奇怪,这时候这个库还缺什么?而且java2jar,不管从名字还是从程序的内容来讲,都是一个将java文件变成一个jar包的过程,不应该再依赖其他的jar包。倒是第二个阶段在生成IR的时候,添加运行时的mplt的库,才符合逻辑。在这种情况下,我将java2jar的源码做了更改:

    #!/bin/bash
    OUTPUT=$1
    JAVA_FILE=$2
    shift 2
    javac -g -d . ${JAVA_FILE}
    jar -cvf ${OUTPUT} *.class   

    这样,java2jar可执行文件就可以通过java2jar out.jar test.java这种格式,来输出一个包含test.class的out.jar包。这样,java2jar可执行文件就可以和我们预期一样正确的执行了。

    这种时候,我们的第一个工具java2jar已经可以正常执行了,一旦有了运行时的库(java-core.jar),我们或许可以尝试将其变成mplt格式,或者直接交给jbc2mpl,结合输入的java文件,直接得到一个最终的IR。因为,jbc2mpl的运行模式我们在前文已经介绍过了,是可以直接接受jar格式的输入,或者是mplt格式的输入的。当然,这种是一个猜测。因为从一个编译器的设计来讲,打包就是打包,只有在生成IR的时候,或许才会给相关的缺失的部分补充信息,所以即使是有运行时库,也应该是在这个阶段补充。所以,我是觉得,真是能找到缺失的java-core.jar的话,可能只需要在jbc2mpl补充就可以了,java2jar就是个打包程序,根本不需要额外的库。

    目前的这些理解和猜测,还有待进一步验证,我会继续深入了解这些工具,争取早日搞清楚这几个工具的正常运行。

    展开全文
  • 手工编译java程序

    千次阅读 2012-07-20 11:46:40
    通过javac、java和javap的help,几个文件组成的程序进行编译和执行。 遇到了几个问题: 1、包中类之间的调用 目录结构为com/test/*.java //A.java package com.test; Public class A{ new B(); } //B....
  • apk文件编译

    2016-05-20 14:02:16
    你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以改应用的APK进行编译查看。当然,也有...
  • 我们在开发 安卓中,有时需要对其他apk文件进行编译,以便我们方便进行学习交流研究使用。 我们使用 Android SDK 默认生成的工程会...我们怎么对他进行反编译Java文件,并让我们看懂呢?下面进行一下简单介绍:
  • 构建配置文件 build.gradle 是纯文本文件,使用领域特定语言 (DSL) 以 Groovy 描述和操纵构建...单引号字符串不会 $ 符进行转义,双引号字符串支持插值操作,会 $ 符转义求值再替换。方法通过def关键字定义一个...
  • 方法如2113下:1、首先我们在命令行运行Java程序5261需要借助jdk的环境依赖,打4102开jdk包,需要找到javac和java两...如下图所示4、接下来执行javac命令对java程序文件进行编译,如下图所示5、编译完毕以后我们会在...
  • 目录前言瘦身前的Jar包解决方案一、前言SpringBoot部署起来虽然简单,如果服务器部署在...这个时候如果想要线上运行工程有一些微调,则非常痛苦二、瘦身前的Jar包Tomcat在部署Web工程的时候,可以进行增量更新,Sp...
  • 1、面向接口编程(1)概念接口是一种规范,一个接口可以有多个实现,面向接口编程可以实现在不修改源代码(最好的方式是修改配置文件而不修改源代码,因为java代码需要编译,而配置文件不需要 )的情况下功能进行切换...
  • 对Java类加载器的认识

    2013-12-31 11:30:24
    java的动态性表现在:我们的程序可以不用全盘的重新编译就能程序某部分进行更新,C#也和java一样具有动态性,而且它的这种动态性表现更为直观:直接生成windows的动态连接库文件——dll文件。而java生成的是...
  • java反射

    2019-02-14 16:02:00
    java反射是指是在运行状态中,对于任意一个类都可以通过它的Class字节码...我们在对java文件进行编译时会执行javac XXX.java,这个时候就会产生一个xxx.class文件,此即对应的字节码文件。 是如何通过Class字节...
  • 解释型语言是相对于编译型语言存在的,源代码不是直接编译为目标代码,而是转成中间代码,再由解释器中间代码进行解释运行。主流编程语言有编译型(如 C++)、解释型(如 JavaScript)、和半解释半编译(如 Java)...
  • 可能有些Android开发者几个ClassLoader(如:AppClassLoader等)比较熟悉,那么,整个类的加载过程:从未进行编译的.java文件,到类的初始化完毕并等待被实例化使用的过程,具体是怎么样的。收集Java资料、看了几篇...
  • 可能有些Android开发者几个ClassLoader(如:AppClassLoader等)比较熟悉,那么,整个类的加载过程:从未进行编译的.java文件,到类的初始化完毕并等待被实例化使用的过程,具体是怎么样的。收集Java资料、看了几篇....
  • 前言上一篇我们粗略的介绍了一下Java...编译一个.java文件经过编译之后,变成了了.class文件,主要经过留下步骤:.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析...
  • 一、 编译型语言和解释型语言1.编译型语言需通过编译器(compiler)将源代码...优点:编译器一般会有预编译的过程代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高,可以脱离...
  • javap是 Java class文件分解器,可以反编译(即javac编译文件进行编译),也可以查看java编译器生成的字节码。用于分解class文件。 那我们已经怎么在Idea中使用javap? 1),File -> settings 2),如下...
  • 可能有些Android开发者几个ClassLoader(如:AppClassLoader等)比较熟悉,那么,整个类的加载过程:从未进行编译的.java文件,到类的初始化完毕并等待被实例化使用的过程,具体是怎么样的。 收集Java资料、看了...
  • 可以总结为如下三个步骤:首先,将程序通过javac命令进行编译,得到.class文件。然后,idea通过java命令的-javaagent参数将要运行的程序加以监控。之后,JVM执行.class文件而在日常的工作中,我们面对的往往不是像...
  • java虚拟机技术的入门知识便是java虚拟机内存模型,只有了解了java虚拟机内存模型,才能更深一步对java虚拟机底层进行探索。为了学习java虚拟机内存模型,我们必须知道一段java代码(或者说一个java类)在java虚拟中...
  • android的基础就是java。以前上大学的时候,学过一些,但是毕业后也没怎么用,这次为了学习android在重新温习下,这样有助于我们在...2.通过javac命令java文件进行编译 3.通过java命令生产的class文件进行运行
  • JAVA类加载机制

    千次阅读 2020-08-26 09:51:05
    如:oracle的HotSpot在java7中方法去放在永久代,java8放在元数据空间,并且通过GC机制这个区域进行管理 那么class文件怎么加载进去的? 类生命周期 在了解类的加载机制之前,我们需要了解一下类的生命周期。...
  • 昨天到今天看了一下这本书:JUnit in Action(second edition)的第5章,这一章讲了怎么使用Cobertura这个工具测试时的代码覆盖率进行度量,这里我按照书里的描述,总结一下在Windows Server环境下的最简单方法。...
  • java的动态性表现在:我们的程序可以不用全盘的重新编译就能程序某部分进行更新,C#也和java一样具有动态性,而且它的这种动态性表现更为直观:直接生成windows的动态连接库文件——dll文件。而java生成的是...
  • 大家都知道Java 编译为class 后可以通过反编译工具再编译Java 文件.常用的反编译工具:idea,jd,jad如果,不希望别人看到...工作原理:读取 jar 文件,其代码按照XML 中的配置进行重写.如:字符串替换,代码改写为内部...
  • [Android]apk反编译方法

    2015-07-13 17:56:00
    在学习Android开发的过程你,你往往会想去学习别人的apk是怎么开发的,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以改应用的APK进行编译查看。下面是我参考了一些文章后简单的...

空空如也

空空如也

1 2 3 4 5
收藏数 99
精华内容 39
关键字:

怎么对java文件进行编译

java 订阅