Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EclipseP2-具有各种P2组件的声明性服务?_Eclipse_Equinox_P2_Declarative Services - Fatal编程技术网

EclipseP2-具有各种P2组件的声明性服务?

EclipseP2-具有各种P2组件的声明性服务?,eclipse,equinox,p2,declarative-services,Eclipse,Equinox,P2,Declarative Services,因此,当我尝试使用以下方法从供应代理获取元数据和工件存储库管理器时,我遇到了这个问题: ServiceReference<?> sr = Activator.getContext().getServiceReference(IProvisioningAgentProvider.SERVICE_NAME); IProvisioningAgentProvider agentProvider = null; if (sr == null)return; agentProvider =

因此,当我尝试使用以下方法从供应代理获取元数据和工件存储库管理器时,我遇到了这个问题:

ServiceReference<?> sr = Activator.getContext().getServiceReference(IProvisioningAgentProvider.SERVICE_NAME);
IProvisioningAgentProvider agentProvider = null;

if (sr == null)return;

agentProvider = (IProvisioningAgentProvider) Activator.getContext().getService(sr);
final IProvisioningAgent agent = agentProvider.createAgent(new URI("some place"));
IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) agent.getService(IArtifactRepositoryManager.SERVICE_NAME);
ServiceReference sr=Activator.getContext().getServiceReference(IProvisioningAgentProvider.SERVICE_NAME);
IProvisioningAgentProvider-agentProvider=null;
if(sr==null)返回;
agentProvider=(IProvisioningAgentProvider)Activator.getContext().getService(sr);
final-IProvisioningAgent=agentProvider.createAgent(新URI(“某地”);
IMetadataRepositoryManager=(IMetadataRepositoryManager)agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
IArtifactRepositoryManager artifactManager=(IArtifactRepositoryManager)agent.getService(IArtifactRepositoryManager.SERVICE_NAME);
如果这些服务已经启动,则可以正常工作。然而,很多时候工件管理器返回空值,因为它的服务还不存在。我已经能够通过将包含上述代码的包的开始级别设置为5来绕过它,因此在我尝试获取它们的服务引用之前,所有服务都已启动


我真的不想在起点水平上搞砸。我想做的是使用声明性服务来设置这些不同的组件,从而延迟服务的启动。唯一的问题是我不知道引用什么服务,所以我可以将它们放在component.xml文件中。这在Eclipse3.7.2中可能吗?

到目前为止,这是我能找到的最好的方法。这并不完美,因为我必须绕过一些循环依赖项,这些依赖项随检查声明性服务绑定方法上的服务名称而来

基本上,我在我的component.xml中将IAgentServiceFactory设置为依赖项

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="com.company.updateManager">
   <implementation class="com.company.updatemanager.UpdateManager"/>
   <service>
      <provide interface="com.company.updatemanager.IUpdateManager"/>
   </service>
   <reference bind="addAgentService" cardinality="1..n" interface="org.eclipse.equinox.p2.core.spi.IAgentServiceFactory" name="IAgentServiceFactory" policy="dynamic"/>
</scr:component>

然后我有一个实现上述组件的类(在下面解释) com.company.updatemanager.updatemanager

package com.company.updatemanager;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.IProvisioningAgentProvider;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.core.spi.IAgentServiceFactory;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.InstallOperation;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.osgi.framework.ServiceReference;

public class UpdateManager implements IUpdateManager {

    URI updateURI;

    boolean alreadyAutoUpdated;

    boolean hasMetaDataRepoMan;
    boolean hasArtifactRepoMan;


    /*
     * I have to hack around some sort of circular dependency that happens when I try to reference
     * the repoManager classes in the addAgentService method.  It doesn't happen when run from
     * the IDE, but does when everything is compiled. It works fine if I access these properties
     * in a constructor or right here or somewhere else, but whatever object in OSGI is binding
     * with the addAgentService method creates a circular dependency.  
     */
    String artifactServiceName = IArtifactRepositoryManager.SERVICE_NAME;
    String metaDataServiceName = IMetadataRepositoryManager.SERVICE_NAME;

    public void addAgentService(IAgentServiceFactory serv, Map properties){
        System.out.println("Got Agent Service " + (String) properties.get("p2.agent.servicename"));
        String serviceName = (String) properties.get("p2.agent.servicename");

        if(serviceName.equals(this.metaDataServiceName)){
            this.hasMetaDataRepoMan = true;
        }else if(serviceName.equals(this.artifactServiceName)){
            this.hasArtifactRepoMan = true;
        }

        if(checkAllServices()){
            autoUpdate();
        }
    }

    private void autoUpdate(){
        if(!alreadyAutoUpdated){
            try {
                alreadyAutoUpdated = true;
                update();
            } catch (ProvisionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private boolean checkAllServices(){
        if(this.hasMetaDataRepoMan && 
                this.hasArtifactRepoMan){
            return true;
        }else{
            return false;
        }
    }

    public void update(){
        ServiceReference<?> sr = Activator.getContext().getServiceReference(IProvisioningAgentProvider.SERVICE_NAME);
        IProvisioningAgentProvider agentProvider = null;

        if (sr == null)return;

        agentProvider = (IProvisioningAgentProvider) Activator.getContext().getService(sr);
        final IProvisioningAgent agent = agentProvider.createAgent(new URI("some place"));
        IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
        IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) agent.getService(IArtifactRepositoryManager.SERVICE_NAME);

        //rest of your update code
    }
}
package com.company.updatemanager;
导入java.net.URI;
导入java.net.URISyntaxException;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.Map;
导入org.eclipse.core.runtime.IStatus;
导入org.eclipse.core.runtime.NullProgressMonitor;
导入org.eclipse.core.runtime.jobs.IJobChangeEvent;
导入org.eclipse.core.runtime.jobs.Job;
导入org.eclipse.core.runtime.jobs.JobChangeAdapter;
导入org.eclipse.equinox.p2.core.IProvisioningAgent;
导入org.eclipse.equinox.p2.core.IProvisioningAgentProvider;
导入org.eclipse.equinox.p2.core.ProvisionException;
导入org.eclipse.equinox.p2.core.spi.IAgentServiceFactory;
导入org.eclipse.equinox.p2.engine.IProfile;
导入org.eclipse.equinox.p2.engine.IProfileRegistry;
导入org.eclipse.equinox.p2.metadata.IInstallableUnit;
导入org.eclipse.equinox.p2.operations.InstallOperation;
导入org.eclipse.equinox.p2.operations.ProvisioningSession;
导入org.eclipse.equinox.p2.query.QueryUtil;
导入org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
导入org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
导入org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
导入org.osgi.framework.ServiceReference;
公共类UpdateManager实现IUpdateManager{
URI updateURI;
布尔值自动更新;
布尔hasMetaDataRepoMan;
布尔hasArtifactRepoMan;
/*
*当我尝试引用时,我必须绕过某种循环依赖
*repoManager类在addAgentService方法中。从运行时不会发生这种情况
*IDE,但在编译所有内容时都会这样做。如果我访问这些属性,它就可以正常工作
*在构造函数中,或者在这里或其他地方,但是OSGI中的任何对象都是绑定的
*使用addAgentService方法创建循环依赖项。
*/
字符串artifactServiceName=IArtifactRepositoryManager.SERVICE\u NAME;
字符串metaDataServiceName=IMetadataRepositoryManager.SERVICE\u NAME;
public void addAgentService(IAgentServiceFactory服务,映射属性){
System.out.println(“Got-Agent-Service”+(String)properties.get(“p2.Agent.servicename”);
String serviceName=(String)properties.get(“p2.agent.serviceName”);
if(serviceName.equals(this.metaDataServiceName)){
this.hasMetaDataRepoMan=true;
}else if(serviceName.equals(this.artifactServiceName)){
this.hasArtifactRepoMan=true;
}
if(checkAllServices()){
自动更新();
}
}
私有void自动更新(){
如果(!AlreadyAutoUpdate){
试一试{
AlreadyAutoUpdate=true;
更新();
}捕获(供应例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(URISyntaxException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有布尔checkAllServices(){
if(this.hasmatarepoman&&
这是哈斯曼){
返回true;
}否则{
返回false;
}
}
公共无效更新(){
ServiceReference sr=Activator.getContext().getServiceReference(IProvisioningAgentProvider.SERVICE_名称);
IProvisioningAgentProvider-agentProvider=null;
if(sr==null)返回;
agentProvider=(IProvisioningAgentProvider)Activator.getContext().getService(sr);
final-IProvisioningAgent=agentProvider.createAgent(新URI(“某地”);
IMetadataRepositoryManager=(IMetadataRepositoryManager)agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
IArtifactRepositoryManager artifactManager=(IArtifactRepositoryManager)agent.getService(IArtifactRepositoryManager.SERVICE_NAME);
//剩下的时间