之所以写makefile的文章,是因为OOO的sdk开发并不像 vs 或者 netbean,或其他IDE集成开发,ooo其工程不是用IDE工具自动生成,而是使用Linux下的makefile文件,这和OOO工程是一样的。Ooo工程也是使用Makefile建立的。 makefile在这种巨大的工程特别适合;没有过多的去研究makefile.
如果需要更为详细的makefile 信息的话,参考这位大哥写的 http://blog.csdn.net/liang13664759/article/details/1771246
我这里不做过多的makefile知识解释。如果是从事过Linux下开发的朋友对makefile肯定相当了解了。这里只针对本样例中的sdk 开发中的一些所要用到的Makefile 做粗糙分析;
PRJ=../../../../.. SETTINGS=$(PRJ)/settings include $(SETTINGS)/settings.mk include $(SETTINGS)/std.mk include $(SETTINGS)/dk.mk
include $(SETTINGS)/settings.mk 其实就是说包含sdk安装目录下../../../../../settings/settings.mk这个mk文件;
COMP_NAME=ProtocolHandlerAddon_java OUT_COMP_CLASS=$(OUT_CLASS)/$(COMP_NAME) OUT_COMP_MISC=$(OUT_MISC)/$(COMP_NAME) COMP_PACKAGE=$(OUT_BIN)/$(COMP_NAME).$(UNOOXT_EXT) COMP_PACKAGE_URL=$(subst \\,\,"$(COMP_PACKAGE_DIR)$(PS)$(COMP_NAME).$(UNOOXT_EXT)") COMP_JAR_NAME=$(COMP_NAME).uno.jar COMP_JAR=$(OUT_CLASS)/$(COMP_JAR_NAME) COMP_MANIFESTFILE=$(OUT_COMP_CLASS)/$(COMP_NAME).uno.Manifest COMP_UNOPKG_MANIFEST = $(OUT_COMP_CLASS)/$(COMP_NAME)/META-INF/manifest.xml COMP_COMPONENTS=$(COMP_NAME).components
JAVAUI = LoginDialog.java DATABASE = DBConnection.java OFFICE = OpenOfficeContext.java JAVAFILES = ProtocolHandlerAddon.java ErrorLog.java CLASSFILES = $(patsubst %.java,$(OUT_COMP_CLASS)/%.class,$(JAVAFILES)) SDK_CLASSPATH = $(subst $(EMPTYSTRING) $(PATH_SEPARATOR),$(PATH_SEPARATOR),$(CLASSPATH)\ $(PATH_SEPARATOR)$(OUT_COMP_CLASS))
CLASSFILES 这个是这些文件的具体路径
SDK_CLASSPATH 这个是sdk安装路径
include $(SETTINGS)/stdtarget.mk $(OUT_COMP_CLASS)/%.Manifest : -$(MKDIR) $(subst /,$(PS),$(@D)) @echo RegistrationClassName: ProtocolHandlerAddon> $@ $(CLASSFILES) : $(JAVAFILES) -$(MKDIR) $(subst /,$(PS),$(@D)) $(SDK_JAVAC) $(JAVAC_FLAGS) -classpath "$(SDK_CLASSPATH)" -d $(OUT_COMP_CLASS) $(JAVAFILES) $(JAVAUI) $(DATABASE) $(OFFICE)这里的$(CLASSFILES) : $(JAVAFILES)
说白了就是使用java编译器编译java指定目录下的java文件,并将生产的java文件放在指定路径;
如果出现中文编码的问题,那么 在 $(JAVAC_FLAGS) -classpath 前面加上-encoding UTF-8; 使用UTF-8进行编码;
$(COMP_JAR) : $(COMP_MANIFESTFILE) $(CLASSFILES) -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) -$(MKDIR) $(subst /,$(PS),$(@D)) $(SDK_JAR) cvfm $@ $< -C $(OUT_COMP_CLASS) .
这个命令式告诉编译器怎么生成jar包 如果你的组件需要导入一些图片,你可以在你的工程目录下建立一个文件夹,比如image ,在里面存放图片。然后再
$(SDK_JAR) cvfm $@ $< -C $(OUT_COMP_CLASS) .后面加上 image/* 然后在下面的这部分的$(COMP_PACKAGE): 后面加上 image/* 这样就会把目录下所有文件打包到jar包和组件里;eg:
$(COMP_PACKAGE) : $(COMP_JAR) Addons.xcu ProtocolHandler.xcu image/* $(COMP_UNOPKG_MANIFEST) $(COMP_COMPONENTS)
$(COMP_PACKAGE) : $(COMP_JAR) Addons.xcu ProtocolHandler.xcu $(COMP_UNOPKG_MANIFEST) $(COMP_COMPONENTS) -$(DEL) $(subst \\,\,$(subst /,$(PS),$@)) -$(MKDIR) $(subst /,$(PS),$(@D)) -$(MKDIR) $(subst /,$(PS),$(OUT_COMP_MISC)) $(COPY) $(subst /,$(PS),$<) $(subst /,$(PS),$(OUT_COMP_MISC)) cd $(subst /,$(PS),$(OUT_COMP_MISC)) && $(SDK_ZIP) ../../bin/$(@F) $(<F) $(SDK_ZIP) -u $@ Addons.xcu ProtocolHandler.xcu $(COMP_COMPONENTS) cd $(subst /,$(PS),$(OUT_COMP_CLASS)/$(subst .$(UNOOXT_EXT),,$(@F))) && $(SDK_ZIP) -u ../../../bin/$(@F) META-INF/manifest.xml
如果你的的插件里的某一些函数要引用到其他的jar包,你必须将他们打包到组件中去。这里我们需要写入到的mainfest文件里去!
比如:
$(OUT_COMP_CLASS)/%.Manifest : -$(MKDIR) $(subst /,$(PS),$(@D)) @echo RegistrationClassName: PatentAnalyse> $@ @echo Class-Path: lib/axis.jar>> $@ @echo lib/commons-discovery-0.2.jar>> $@ @echo lib/javax.wsdl_1.6.2.v201005080631.jar>> $@ @echo lib/jaxrpc.jar>> $@ @echo lib/saaj.jar>> $@ @echo lib/org.apache.commons.logging_1.0.4.v201005080501.jar>> $@
而且必须是这种格式,@echo 与你要到的包之间必须是两个空格!必须是用Class-Path: 然后,一个jar包用一行。