5 Replies Latest reply on Jan 21, 2008 3:03 AM by kukeltje

    ProcessArchives and ProcessState problem

    rodrobin

      Hey...,

      I've run into a nasty problem when deploying via process archives (PARs) and utilizing sub-processes in process definitions: ClassNotFoundExceptions in the referenced sub-process.

      The super-process class loader works as expected and locates its serialized resources in the database but the class loader for the sub-process fails.

      Of course if the offending class(es) are available to the jBPM class loader the problem goes away but then using PARs for versioning resources won't work.

      So I guess my questions are, isn't this a bug in jBPM and is there a workaround?

      Thanks,

      /Robin

        • 1. Re: ProcessArchives and ProcessState problem
          rodrobin

          Sorry... Forgot to specify I'm using jBPM version 3.2.2.

          Full stacktrace:

          17:59:55,166 [main] ERROR org.jbpm.instantiation.Delegation(142) : couldn't load delegation class 'dk.telia.ads.actions.Versioning'
          java.lang.ClassNotFoundException: class 'dk.telia.ads.actions.Versioning' could not be found by the process classloader
          at org.jbpm.instantiation.ProcessClassLoader.findClass(ProcessClassLoader.java:118)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
          at org.jbpm.instantiation.Delegation.instantiate(Delegation.java:140)
          at org.jbpm.instantiation.Delegation.getInstance(Delegation.java:125)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.instantiation.Delegation_$$_javassist_7.getInstance(Delegation_$$_javassist_7.java)
          at org.jbpm.graph.def.Action.execute(Action.java:121)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Action_$$_javassist_115.execute(Action_$$_javassist_115.java)
          at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:264)
          at org.jbpm.graph.def.Node.execute(Node.java:339)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:196)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at dk.telia.ads.actions.TestVersioning.test(TestVersioning.java:58)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
          at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
          at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
          at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
          at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
          at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
          at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
          at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
          17:59:55,175 [main] ERROR org.jbpm.instantiation.Delegation(165) : couldn't instantiate delegation class 'dk.telia.ads.actions.Versioning'
          java.lang.NullPointerException
          at org.jbpm.instantiation.FieldInstantiator.newInstance(FieldInstantiator.java:105)
          at org.jbpm.instantiation.FieldInstantiator.instantiate(FieldInstantiator.java:48)
          at org.jbpm.instantiation.Delegation.instantiate(Delegation.java:163)
          at org.jbpm.instantiation.Delegation.getInstance(Delegation.java:125)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.instantiation.Delegation_$$_javassist_7.getInstance(Delegation_$$_javassist_7.java)
          at org.jbpm.graph.def.Action.execute(Action.java:121)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Action_$$_javassist_115.execute(Action_$$_javassist_115.java)
          at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:264)
          at org.jbpm.graph.def.Node.execute(Node.java:339)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:196)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at dk.telia.ads.actions.TestVersioning.test(TestVersioning.java:58)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
          at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
          at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
          at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
          at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
          at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
          at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
          at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
          17:59:55,183 [main] ERROR org.jbpm.graph.def.GraphElement(275) : action threw exception: null
          java.lang.NullPointerException
          at org.jbpm.graph.def.Action.execute(Action.java:122)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Action_$$_javassist_115.execute(Action_$$_javassist_115.java)
          at org.jbpm.graph.def.GraphElement.executeAction(GraphElement.java:264)
          at org.jbpm.graph.def.Node.execute(Node.java:339)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at org.jbpm.graph.node.ProcessState.execute(ProcessState.java:196)
          at org.jbpm.graph.def.Node.enter(Node.java:319)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.enter(Node_$$_javassist_166.java)
          at org.jbpm.graph.def.Transition.take(Transition.java:151)
          at org.jbpm.graph.def.Node.leave(Node.java:394)
          at org.jbpm.graph.node.StartState.leave(StartState.java:70)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:173)
          at org.jbpm.graph.def.Node_$$_javassist_166.leave(Node_$$_javassist_166.java)
          at org.jbpm.graph.exe.Token.signal(Token.java:195)
          at org.jbpm.graph.exe.Token.signal(Token.java:140)
          at org.jbpm.graph.exe.ProcessInstance.signal(ProcessInstance.java:271)
          at dk.telia.ads.actions.TestVersioning.test(TestVersioning.java:58)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:589)
          at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
          at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
          at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
          at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
          at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
          at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
          at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
          at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
          at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
          at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

          /Robin

          • 2. Re: ProcessArchives and ProcessState problem
            kukeltje

            a subprocess does not inherit the parent process classloader afaik. So you have to deploy these classes in both archives or ditch versioning and deploy them at a higher level

            • 3. Re: ProcessArchives and ProcessState problem
              rodrobin

              Hey Ronald,

              Thanks for your reply. You're right that the super process class loader isn't propagated to the sub process and I wasn't expecting that (also verified by looking at the source) since that would seriously mess up the versioning semantics.

              However, I posted precisely because I did include the the class the (sub) process class loader was complaining it couldn't find in the (sub) process archive which meant it should have been able to find it.

              But... It isn't a bug. I reproduced the problem when testing from within my IDE, created a self-contained archive that I could use when reporting the issue on BugZilla but, surprisingly, running the archive via the command line made the problem disappear. A little housecleaning of referenced jars on our integration server and the problem disappeared there as well.

              I really don't see how this could fix the problem and that worries me a little, but that's an investigation for another day.

              Thanks again,

              /Robin

              • 4. Re: ProcessArchives and ProcessState problem
                kukeltje

                hmm... do you have any clue which jar? I personally would not have a clue. Only e.g. that the superprocess referenced a specific version of a subprocess which just did not have it included. Redeploying a subprocess does not make the superprocess use that newer version. Only if you use late-binding.

                • 5. Re: ProcessArchives and ProcessState problem
                  kukeltje

                  with 'have it include' I of course mean the actionhandler, not one of the jars