ceylon / ceylon-runtime

DEPRECATED
24 stars 5 forks source link

Module linkage error #82

Open FroMage opened 9 years ago

FroMage commented 9 years ago

In ceylon.transaction:

module ceylon.transaction "1.1.1" {
// if I comment this out, I get an error
    //shared import javax.transaction.api "1.2";
    shared import org.jboss.narayana.jta "5.1.1.Final";
}

And its test:

module test.ceylon.transaction "1.1.1" {
    import ceylon.transaction "1.1.1";
}

The definition of org.jboss.narayana.jta:

<module xmlns="urn:jboss:module:1.1" name="org.jboss.jboss-transaction-spi" slot="7.1.1.Final">
  <resources>
    <resource-root path="jboss-transaction-spi-7.1.1.Final.jar"/>
  </resources>
  <dependencies>
    <module name="javax.transaction.api" export="false" slot="1.2"/>
    <module name="org.jboss.logging" export="true" slot="3.1.4.GA"/>
  </dependencies>
</module>

And javax.transaction.api:

<module xmlns="urn:jboss:module:1.1" name="javax.transaction.api" slot="1.2">
    <resources>
        <resource-root path="javax.transaction.api-1.2.jar"/>
    </resources>
</module>

The error I get are:

Debug: Finding class javax.transaction.xa.XAResource from Module "test.ceylon.transaction:1.1.1" from Ceylon ModuleLoader: RootRepositoryManager: FileContentStore: /home/stephane/.ceylon/cache
Debug: Finding local class javax.transaction.xa.XAResource from Module "javax.transaction.api:1.2" from Ceylon ModuleLoader: RootRepositoryManager: FileContentStore: /home/stephane/.ceylon/cache
Debug: Loading class javax.transaction.xa.XAResource locally from Module "javax.transaction.api:1.2" from Ceylon ModuleLoader: RootRepositoryManager: FileContentStore: /home/stephane/.ceylon/cache

Debug: Finding class javax.transaction.xa.XAResource from Module "org.jboss.narayana.jta:5.1.1.Final" from Ceylon ModuleLoader: RootRepositoryManager: FileContentStore: /home/stephane/.ceylon/cache
Warning: Failed to define class com.arjuna.ats.jta.resources.LastResourceCommitOptimisation in Module "org.jboss.narayana.jta:5.1.1.Final" from Ceylon ModuleLoader: RootRepositoryManager: FileContentStore: /home/stephane/.ceylon/cache java.lang.LinkageError: loader constraint violation: loader (instance of ceylon/modules/jboss/runtime/CeylonModuleClassLoader) previously initiated loading for a different type with name "javax/transaction/xa/XAResource"
Debug: Unexpected error in module loader java.lang.LinkageError: loader constraint violation: loader (instance of ceylon/modules/jboss/runtime/CeylonModuleClassLoader) previously initiated loading for a different type with name "javax/transaction/xa/XAResource"
FroMage commented 9 years ago

I guess I'll need some help from @dmlloyd

FroMage commented 9 years ago

Even an upgrade to the latest 1.4.4.Final does not fix this.

alesj commented 9 years ago

@FroMage imo, you get that same class XAResource from a module and also from JDK. /Cc @dmlloyd

FroMage commented 9 years ago

From what I can see in the debugger, the first time it's loaded by the ModuleClassLoader for javax.transaction.api:1.2, which sounds right. The second time it's loaded as a by-product of defining a class (com.arjuna.ats.jta.resources.LastResourceCommitOptimisation) from org.jboss.jboss-transaction-spi where it fails, but no clue why, my debugger just jumps around randomly.

FroMage commented 9 years ago

@alesj that class is not in the JDK, although its package is.

FroMage commented 9 years ago

AHA, we're getting somewhere. I told the CeylonModuleLoader (@alesj's creation) that the JDK did not have a javax.transaction module with a javax.transaction.xa package (nobody depended on it explicitly), and it fails to link h2 (another module), which does not have a module descriptor and depended on it implicitly (like everyone depends on the JDK). So I assume that for some reason it used to get that dependency (on the jar) via the JDK auto-import (which is surely wrong).

FroMage commented 9 years ago

ARG DAMNIT you're right the JDK does have some stuff in javax.transaction.xa. And yes that includes XAResource:

      491  2015-01-27 00:43   javax/transaction/InvalidTransactionException.class
      494  2015-01-27 00:43   javax/transaction/TransactionRequiredException.class
      500  2015-01-27 00:43   javax/transaction/TransactionRolledbackException.class
     1449  2015-01-27 00:42   javax/transaction/xa/XAException.class
     1062  2015-01-27 00:42   javax/transaction/xa/XAResource.class
      292  2015-01-27 00:42   javax/transaction/xa/Xid.class

But my jars need more than this. So how do I resolve this shit?

FroMage commented 9 years ago

The javax.transaction.api module contains:

      541  2013-10-08 15:44   javax/transaction/Status.class
      483  2013-10-08 15:44   javax/transaction/HeuristicRollbackException.class
      491  2013-10-08 15:44   javax/transaction/InvalidTransactionException.class
      499  2013-10-08 15:44   javax/transaction/TransactionScoped.class
      863  2013-10-08 15:44   javax/transaction/Transactional.class
      292  2013-10-08 15:44   javax/transaction/xa/Xid.class
     1468  2013-10-08 15:44   javax/transaction/xa/XAException.class
     1062  2013-10-08 15:44   javax/transaction/xa/XAResource.class
      195  2013-10-08 15:44   javax/transaction/Synchronization.class
      661  2013-10-08 15:44   javax/transaction/UserTransaction.class
      474  2013-10-08 15:44   javax/transaction/HeuristicMixedException.class
      631  2013-10-08 15:44   javax/transaction/TransactionSynchronizationRegistry.class
      477  2013-10-08 15:44   javax/transaction/HeuristicCommitException.class
      771  2013-10-08 15:44   javax/transaction/Transaction.class
      456  2013-10-08 15:44   javax/transaction/RollbackException.class
      494  2013-10-08 15:44   javax/transaction/TransactionRequiredException.class
      500  2013-10-08 15:44   javax/transaction/TransactionRolledbackException.class
      885  2013-10-08 15:44   javax/transaction/TransactionManager.class
     1366  2013-10-08 15:44   javax/transaction/Transactional$TxType.class
      585  2013-10-08 15:44   javax/transaction/SystemException.class
      463  2013-10-08 15:44   javax/transaction/TransactionalException.class
      468  2013-10-08 15:44   javax/transaction/NotSupportedException.class
FroMage commented 9 years ago

So it's a superset of the JDK's javax.transaction I suppose.

alesj commented 9 years ago

Yup, that javax.transactions is some funky shit ...

FroMage commented 9 years ago

So what am I supposed to do? Exclude some classes from javax.transaction.api so that the JDK parts get picked up? Are they even the same classes?

FroMage commented 9 years ago

Apparently excluding it is not enough since it excludes it from export, but it's still in the module itself.

FroMage commented 9 years ago

Nope, I can't win this way. Even if I did manage that, I'd have to make the ceylon module depend on the javax.transaction module from the JDK, but it can't because the compiler does not support split packages. OK at this point it's just too damn complicated to fix, I'll move this to 1.3.