文档章节

eclipse插件导出war包中遇到的问题以及解决方式

nero_zy
 nero_zy
发布于 2016/06/12 15:46
字数 1056
阅读 249
收藏 1

最近为了配合docker 容器平台的工作,实现一个eclipse插件,领导希望的功能是,右键点击项目提供一个war包commit的按钮,点击按钮后,自动调用eclipse的打包过程,输出war包,最终将war包上传到服务端,实现自动化的快速部署。

好了,功能如上,在原有插件的基础上加了相应的菜单,在获取项目的过程就不在累述,最后调用的打包过程如下:

	public static  void exportWar(IProject webProject) throws CoreException {
		webProject.build(IncrementalProjectBuilder.FULL_BUILD, null);
	    WebComponentExportDataModelProvider modelProvider = new WebComponentExportDataModelProvider();
	    IDataModel dataModel = DataModelFactory.createDataModel(modelProvider);
	    String projectName = webProject.getName();
        //war包的位置
	    String destination_string = webProject.getLocation().append(projectName).addFileExtension("war").toOSString(); 
        //datamodel的相关参数设置
	    dataModel.setStringProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination_string);
	    dataModel.setStringProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
	    dataModel.setProperty(IJ2EEComponentExportDataModelProperties.COMPONENT, ComponentCore.createComponent(webProject));
//	    dataModel.setBooleanProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, false);
//	    dataModel.setBooleanProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, true);

	    IDataModelOperation modelOperation = dataModel.getDefaultOperation();
	    try {
            //执行打包
	        modelOperation.execute(new NullProgressMonitor(), null);
	    } catch (org.eclipse.core.commands.ExecutionException e) {
			e.printStackTrace();
		}
	}

如上代码,我看到某些方法,需要的类基本都在eclipse目录下的plugin下面,因此,就想当然的将所有需要的jar包直接拷贝到了插件项目下的lib下,并且加入了buildpath,乍看之下项目已经不报错了,一般来说,就可以进行操作了,使用eclipse的debug的方式,启动了插件,创建一个dynamic web project,然后右键导出 然后就出错了,一个很奇怪的错误,错误没有保存,但是最终的错误如下

org.eclipse.wst.common.modulecore.ModuleCoreNature cannot cast org.eclipse.wst.common.modulecore.ModuleCoreNature

跟踪代码发现,这里是在dataModel.setProperty()中,有个预处理的过程,其中有一部强转,爱强转的时候报了如上错误。

 

解决思路,一开始以为,我获取project的方式是不是有问题,拿到的project不是web项目,后来发现,取project的方法都是一样,直接通过workspace类获取,所以没有你问题,实在找不到解决办法,发现aws的eclipse插件有类似的功能,从github上下载下来看了下代码,发现他插件的处理方式几乎是一样的

   public static IPath exportProjectToWar(IProject project, IPath directory) {
        File tempFile;
        try {
            tempFile = File.createTempFile("aws-eclipse-", ".war", directory.toFile());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Unable to create web application archive: " + e.getMessage(), e);
        }
        return exportProjectToWar(project, directory, tempFile.getName());
    }

    public static IPath exportProjectToWar(IProject project, IPath directory, String fileName) {
        IDataModel dataModel = DataModelFactory.createDataModel(new WebComponentExportDataModelProvider());

        if (directory.toFile().exists() == false) {
            if (directory.toFile().mkdirs() == false) {
                throw new RuntimeException("Unable to create temp directory for web application archive.");
            }
        }

        String filename = new File(directory.toFile(), fileName).getAbsolutePath();

        dataModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, filename);
        dataModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, project.getName());

        try {
            IDataModelOperation operation = dataModel.getDefaultOperation();
            operation.execute(new NullProgressMonitor(), null);
        } catch (ExecutionException e) {
            // TODO: better error handling
            e.printStackTrace();
            throw new RuntimeException("Unable to create web application archive: " + e.getMessage(), e);
        }

        return new Path(filename);
    }

然后问题就卡这里,后来终于发现问题的所在,在aws的项目中,Plug-in Dependences中的包含了所有eclipse的相关的依赖,具体如下

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: AWS Elastic Beanstalk Eclipse Plugin
Bundle-SymbolicName: com.amazonaws.eclipse.elasticbeanstalk;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.amazonaws.eclipse.elasticbeanstalk.ElasticBeanstalkPlugin
Bundle-Vendor: Amazon Web Services
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.filesystem;bundle-version="1.2.0",
 org.eclipse.core.runtime;bundle-version="3.4.0",
 org.eclipse.core.resources;bundle-version="3.4.0",
 org.eclipse.jst.j2ee;bundle-version="1.1.0",
 org.eclipse.jst.j2ee.web;bundle-version="1.1.0",
 org.eclipse.jst.server.core;bundle-version="1.2.0",
 org.eclipse.wst.common.core;bundle-version="1.1.0",
 org.eclipse.wst.common.frameworks;bundle-version="1.1.0",
 org.eclipse.wst.server.core;bundle-version="1.1.0",
 org.eclipse.jdt.core;bundle-version="3.4.0",
 org.eclipse.jdt.launching;bundle-version="3.4.0",
 com.amazonaws.eclipse.core;bundle-version="2.3.1",
 com.amazonaws.eclipse.ec2;bundle-version="1.1.0",
 com.amazonaws.eclipse.sdk.ui;bundle-version="2.1.0",
 org.eclipse.core.databinding;bundle-version="1.2.0",
 org.eclipse.core.databinding.beans;bundle-version="1.2.0",
 org.eclipse.jface.databinding;bundle-version="1.3.0",
 org.eclipse.jface.text;bundle-version="3.4.0",
 org.eclipse.wst.common.project.facet.core;bundle-version="1.3.0",
 org.eclipse.debug.ui;bundle-version="3.4.0",
 org.eclipse.wst.server.ui;bundle-version="1.1.0",
 org.eclipse.core.net;bundle-version="1.2.0",
 org.eclipse.ui.forms;bundle-version="3.3.0",
 org.eclipse.jst.j2ee.ejb;bundle-version="1.1.0",
 org.eclipse.ui.navigator;bundle-version="3.2.0",
 com.jcraft.jsch;bundle-version="0.1.41"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Export-Package: com.amazonaws.eclipse.elasticbeanstalk.server.ui,
 com.amazonaws.eclipse.elasticbeanstalk.deploy
Bundle-ClassPath: .,
 src/,
 lib/jgit/jgit-1.3.0-aws-git-push.jar
Bundle-ActivationPolicy: lazy

而我的项目中eclipse相关的添加方式不一样

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Sina App Engine Eclipse Plug-in
Bundle-SymbolicName: com.sina.sae.eclipse; singleton:=true
Bundle-Version: 1.1.0
Bundle-Vendor: Sina
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.jdt.core,
 org.eclipse.core.resources,
 org.eclipse.jdt.ui,
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.ui.part
Bundle-Activator: com.sina.sae.eclipse.SAEPlugin
Bundle-ClassPath: lib/sequence-library-1.0.1.jar,
 lib/sqljet-1.1.0.jar,
 lib/svnkit-1.7.4.jar,
 lib/svnkit-cli-1.7.4.jar,
 lib/svnkit-javahl16-1.7.4.jar,
 lib/trilead-ssh2-1.0.0-build214.jar,
 lib/org.eclipse.jst.j2ee_1.1.850.v201506041749.jar,
 lib/org.eclipse.jst.j2ee.web_1.1.850.v201503311656.jar,
 lib/org.eclipse.ui.workbench_3.107.0.v20150825-2206.jar,
 lib/org.eclipse.wst.common.frameworks_1.2.200.v201304241450.jar,
 lib/org.eclipse.wst.common.modulecore_1.2.401.v201408132036.jar,
 lib/org.eclipse.jem.util_2.1.200.v201404021757.jar,
 lib/org.eclipse.wst.common.emfworkbench.integration_1.2.101.v201107081800.jar,
 lib/org.eclipse.emf.common_2.11.0.v20150805-0538.jar,
 lib/org.eclipse.emf.ecore_2.11.1.v20150805-0538.jar,
 lib/org.eclipse.emf.ecore.xmi_2.11.1.v20150805-0538.jar,
 lib/org.eclipse.jst.j2ee.core_1.3.200.v201505041449.jar,
 lib/org.eclipse.wst.common.core_1.2.0.v200908251833.jar,
 lib/org.eclipse.wst.common.project.facet.core_1.4.300.v201111030423.jar,

 .

注意aws中的方式,是在Require-Bundle: 中添加需要的模块,而我直接在Bundle-ClassPath中添加了eclipse的相关模块(其实这里是添加外部引用类的,不能添加eclipse相关的类),后来也采用了aws的所示的方式将依赖重新引用,在此debug就没事了,war包能正常输出了

© 著作权归作者所有

nero_zy
粉丝 1
博文 17
码字总数 11823
作品 0
程序员
私信 提问
加载中

评论(1)

nero_zy
nero_zy 博主
以上的文件在manifex中修改
eclipse创建第一个springboot例子

1.环境:eclipse,jdk1.8,tomcat8 一 、eclipse安装springboot插件。 在菜单栏中选择help-Eclipse marketplace ,在弹出窗口选择popular,找到Spring Tools,安装。 3.检查springboot插件是否成...

west_coast
2018/08/27
1K
0
OSGI开发的一点心得

最近用OSGI+嵌入jetty做了一个IDE的后台管理,OSGI真是个好东西,即插即用。 现总结一下初学时候遇到的问题。 1、启动WEB服务 需要加载6个插件(org.eclipse.osgi是默认一定要加载的插件,不...

anrainie
2012/03/07
0
0
[异常解决] 初玩SAE遇到的小问题——注册&创建项目+MyEclipse装插件直接部署+一个简单的JSP部署实现

① 新浪SAE快速上手教程:http://jingyan.baidu.com/season/43090 上面一个链接是针对PHP的相关介绍,如果用java还有点不一样,具体请看新浪SAE官网:http://sae.sina.com.cn/doc/java/tutor...

史迪奇2号
2017/08/29
0
0
cas eclipse 部署的相关问题

先我想问一下有没有人有很好的cas 最新版本在eclipse上详细的部署教程,发一份给我,感激不尽。。因为我自己部署也是根据百度上提供的方案部署的成功了。。但是部署最新版本还是没有成功。愁...

Tony_Learn
2017/02/08
171
0
使用Maven如何debug和热部署

最近尝试将项目用Maven管理,Maven管理能力确实不错,但在开发时,却遇到了一些问题,望大家指点: 1、debug问题: 我是使用Maven的tomcat插件:tomcat-maven-plugin在eclipse里直接集成tom...

nick_chen
2013/01/21
35.8K
10

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
29分钟前
4
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
40分钟前
3
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
今天
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部