Jpa 在Websphere应用服务器8.5下运行Sonar Ant任务 背景

Jpa 在Websphere应用服务器8.5下运行Sonar Ant任务 背景,jpa,websphere,sonarqube,Jpa,Websphere,Sonarqube,我们有一个Java企业应用程序运行在WAS8中。此应用程序需要运行SonarQube任务来分析某些类 问题 在执行Ant任务时,SonarQube将初始化Hibernate。以下是SystemOut日志: INFO - Load batch settings INFO - User cache: /home/SVCEsDev0066/.sonar/cache INFO - Install plugins INFO - Install JDBC driver INFO - Create

我们有一个Java企业应用程序运行在WAS8中。此应用程序需要运行SonarQube任务来分析某些类

问题 在执行Ant任务时,SonarQube将初始化Hibernate。以下是SystemOut日志:

INFO  - Load batch settings
INFO  - User cache: /home/SVCEsDev0066/.sonar/cache
INFO  - Install plugins
INFO  - Install JDBC driver
INFO  - Create JDBC datasource for jdbc:mysql://180.101.185.60:3306/sonar?useUnicode=true&characterEncoding=utf8
INFO  - Initializing Hibernate
之后,我们将收到以下错误消息:

 org.sonar.runner.impl.RunnerException: Unable to execute Sonar
 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
 at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
 at java.security.AccessController.doPrivileged(AccessController.java:229)
 at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
 at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
 at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
 at org.sonar.runner.api.Runner.execute(Runner.java:100)
 at org.sonar.ant.SonarTask.launchAnalysis(SonarTask.java:53)
 at org.sonar.ant.SonarTask.execute(SonarTask.java:48)
 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
 at sun.reflect.GeneratedMethodAccessor152.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
 at java.lang.reflect.Method.invoke(Method.java:613)
 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)
 at org.apache.tools.ant.Task.perform(Task.java:348)
 at org.apache.tools.ant.Target.execute(Target.java:357)
 at org.apache.tools.ant.Target.performTasks(Target.java:385)
 at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
 at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
 at org.sgb.builder.jobs.BuilderJob.checkoutAndBuild(BuilderJob.java:277)
 at org.sgb.builder.jobs.BuilderJob.execute(BuilderJob.java:90)
 at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
 at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
 Caused by: javax.persistence.PersistenceException: java.lang.ClassNotFoundException: com.ibm.websphere.persistence.PersistenceProviderImpl
 at javax.persistence.Persistence.findAllProviders(Persistence.java:93)
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:49)
 at org.sonar.jpa.session.AbstractDatabaseConnector.createEntityManagerFactory(AbstractDatabaseConnector.java:66)
 at org.sonar.jpa.session.AbstractDatabaseConnector.start(AbstractDatabaseConnector.java:46)
 at org.sonar.jpa.session.DefaultDatabaseConnector.start(DefaultDatabaseConnector.java:37)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
 at java.lang.reflect.Method.invoke(Method.java:613)
 at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.invokeMethod(ReflectionLifecycleStrategy.java:110)
 at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.start(ReflectionLifecycleStrategy.java:89)
 at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.start(AbstractInjectionFactory.java:84)
 at org.picocontainer.behaviors.AbstractBehavior.start(AbstractBehavior.java:169)
 at org.picocontainer.behaviors.Stored$RealComponentLifecycle.start(Stored.java:132)
 at org.picocontainer.behaviors.Stored.start(Stored.java:110)
 at org.picocontainer.DefaultPicoContainer.potentiallyStartAdapter(DefaultPicoContainer.java:1015)
 at org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:1008)
 at org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:766)
 at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:91)
 at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
 at org.sonar.batch.bootstrapper.Batch.startBatch(Batch.java:92)
 at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:74)
 at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:48)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
 at java.lang.reflect.Method.invoke(Method.java:613)
 at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
 ... 22 more
 Caused by: java.lang.ClassNotFoundException: com.ibm.websphere.persistence.PersistenceProviderImpl
 at java.net.URLClassLoader.findClass(URLClassLoader.java:599)
 at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:743)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:720)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:690)
 at javax.persistence.Persistence.findAllProviders(Persistence.java:79)
 ... 49 more
Sonar正在尝试加载类:com.ibm.websphere.persistence.PersistenceProviderImpl,它是应用程序服务器JPA配置提供程序。我们尝试将提供程序从WAS控制台更改为使用OpenJPA,但没有任何更改:它尝试再次加载同一个类

问题 是否存在强制Sonar不使用此提供商的情况? 另一种方法是强制Sonar加载com.ibm.websphere.persistence.PersistenceProviderImpl类,但我们在哪里可以找到它?那么,我们怎么能强迫它呢

更多细节 我们已经开始使用SonarQube 4.3.2,在出现第一个错误后,我们将其更新为4.5.1。SonarAntTask版本为2.2。这是我们的任务代码:

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="sonar" name="SonarAnt">
<target name="sonar">
  <taskdef resource="org/sonar/ant/antlib.xml" uri="antlib:org.sonar.ant" classpath="sonar-ant-task-2.2.jar"/>
    <sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/>
</target>
<property name="sonar.java.source" value="1.7"/>
<property name="sonar.projectVersion" value="build_2"/>
<property name="sonar.jdbc.password" value="******"/>
<property name="sonar.host.url" value="http://***.***.***.***:9000"/>
<property name="sonar.jdbc.username" value="******"/>
<property name="sonar.jdbc.url" value="jdbc:mysql://***.***.***.***:3600/sonar?  useUnicode=true&amp;amp;characterEncoding=utf8"/>
<property name="sonar.projectKey" value="PortalSGS_V01R00F00"/>
<property name="sonar.projectName" value="PortalSGS Desc"/>
<property name="sonar.modules" value="sgs-business-review"/>
<property name="sgs-business-review.sonar.projectName" value="sgs-business-review"/>
<property name="sgs-business-review.sonar.projectBaseDir" value="C:\ARQDISP\tmp\CreavistaBL_xIS10460_20140806_110225\vSGS_Portal\SGS_Business_ALM\sgs-business-review"/>
<property name="sgs-business-review.sonar.sources" value="src"/>
我们还尝试在te ant任务定义中指定类路径,如下所示:

  <target name="sonar">
<taskdef resource="org/sonar/ant/antlib.xml" uri="antlib:org.sonar.ant" classpath="sonar-ant-task-2.2.jar"/>
<sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/>
但什么也没发生

参与蚂蚁任务 这是我们的应用程序调用任务的方式:

1.-创建一个antTask.xml,如图所示

2.-初始化org.apache.tools.ant.Project对象和org.apache.tools.ant.ProjectHelper

3.-它从项目类调用executeTarget方法


提前感谢。

请编辑您的问题,告诉我们您使用的是哪个版本的SonarQube和Ant任务?另外,能否复制粘贴build.xml文件的一个片段,以查看如何声明sonar任务?看起来sonar任务没有在它自己的类路径上执行。谢谢Fabrice,我已经用版本更新了这个问题,并且我们的antTask文件的一个片段。SonarQube Runner在一个孤立的类加载器中执行,父类加载器的类不可见。因此,预计看不到com.ibm.websphere.persistence.PersistenceProviderImpl。这里的问题是它为什么要加载这个类?这意味着META-INF/services/javax.persistence.spi.PersistenceProvider未正确过滤。但我无法复制。您的SQ实例中是否安装了任何自定义插件?我们使用java、javascprit和web插件进行了标准安装。我认为WebSphereClassLoader正在与sonar类混为一谈。我已经更新了这个问题,包括我们执行ant任务的方式。